Почему выражение javascript в привязке Vue ‹g-image› не работает?

У меня есть вариант использования, когда мне нужно динамически привязать атрибут src тегов <g-image>. Я узнал, что могу использовать выражения javascrpt в v-bind, поэтому я продолжил. Но вот парадокс:

<g-image :src="'~/images/blocks.png'" width="500"/> // does not work
<g-image src="~/images/blocks.png" width="500"/> //works!

Почему один работает, а другой нет, хотя они должны оцениваться с одинаковыми значениями? Я планирую использовать его как <g-image :src="'~/images/'+imageName+'.png'" width="500"/>


person DaveIdito    schedule 06.01.2021    source источник
comment
пожалуйста, проверьте этот stackoverflow.com/questions/53950105/   -  person Boussadjra Brahim    schedule 06.01.2021
comment
Пробовали ли вы использовать v-bind:src вместо :src, сокращенный синтаксис (:src) может не работать, если вы работаете непосредственно внутри html (iirc)   -  person Joshua Angnoe    schedule 06.01.2021


Ответы (1)


Документация по Gridsome

Атрибут src и параметры, такие как width, height и quality, должны быть статическими значениями, поскольку они скомпилированы в объект, который содержит URL-адреса и другую информацию, которая будет отображаться в теге img.

Я признаю, что я не постоянный пользователь Gridsome, и все, что следует за этим, исходит из моего понимания Vue/Webpack, документов Gridsome и эта проблема

g-image — это компонент, предоставленный Gridsome, предназначенный для упрощения использования адаптивных изображений. Большая часть работы выполняется во время времени сборки — они используют некоторую магию Webpack для обработки шаблонов Vue. Если найден g-image, считывается его атрибут src, и если он содержит путь к существующему локальному образу, они берут образ, создают несколько его копий с разными размерами и добавляют srcset, который позволяет браузеру решать, какое изображение загружать, в зависимости от размера экрана...

Важно то, что все это происходит во время сборки. Это означает, что ваше приложение не запущено, что означает, что невозможно оценить какое-либо динамическое выражение JS, используемое для src (вероятно, на основе состояния приложения)!

Может показаться, что используется require() (это конструкция Webpack, которая позволяет некоторый динамический контент) заставляет его работать, но вы потеряете основную g-image функцию, которая заключается в автоматическом создании адаптивного изображения...

Это не та проблема, которую легко решить на стороне Gridsome (посмотрите, насколько стара проблема и сколько внимания со стороны сопровождающих она получает). Если вам действительно нужны динамические адаптивные изображения, вам нужно будет использовать простой img и сгенерировать варианты изображения (и srcset) другим способом. Или вы можете использовать Cloudinary для создания этих изображений на лету....

person Michal Levý    schedule 06.01.2021