VueJs, динамически загружающий src, не работает

Я пытаюсь динамически загрузить изображение VueJs, чтобы я мог изменить его позже, но я продолжаю получать сообщение об ошибке «404 not found».

Вот тег img

<img class = "image" :src = "imageSrc" alt = "image">

и js-код.

export default {
  data () {
    return {
      imageSrc: '@/assets/gallery/images/20211005_0044.jpg'
    }
}

Если я поставлю тот же путь прямо в img, вот так, это работает, поэтому изображение существует. Я также пытался использовать ref и изменять src таким образом, а затем сначала загружалось изображение (с путем непосредственно в src), но как только я пытался его изменить, я возвращал ошибку 404 not found.

Примечание. Я видел этот вопрос Динамическая загрузка Vuejs image src не работает, но это тоже не помогло.

Спасибо.

Не могли бы вы подробнее объяснить, почему ответ на связанный вопрос не сработал для вас? Что интерполируется в атрибут src изображения? Это необработанная строка (начинающаяся с @) или действительный URL-адрес, который просто указывает на неправильное место? В другом связанном вопросе stackoverflow.com/a/75881654/2977638 я обнаружил, что иногда require приводит к созданию строки в кодировке base64, что также может быть проблемой для этого конкретного варианта использования.

RNanoware 12.04.2023 17:43

Я использую v-bind:src = "imageSrc" в своем коде и imageSrc = "imageSrc: '@/assets/gallery/images/image.jpg'", это не работает, но когда я указываю тот же путь (imageSrc: ' @/assets/gallery/images/image.jpg') в src (без использования v-bind), он работает, поэтому путь правильный. Я попробовал решение, указанное в связанном вопросе, но это не помогло, и я получил то же сообщение об ошибке. на данный момент я не использую «требовать»

Elias Mulderij 12.04.2023 18:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Примечание: весь этот ответ использует require для решения проблемы. Я не знаю обходных путей, позволяющих избежать явных утилит импорта.


Здесь есть пара особенностей Vue/Webpack.

Во-первых, Webpack знает только, как преобразовать определенный ограниченный набор спецификаций пути импорта в соответствующие URL-адреса в окончательной сборке. Использование переменной data в качестве значения реквизита :src не является поддерживаемым синтаксисом: Webpack просто видит это как общую переменную и не будет ее преобразовывать.

Как упоминалось в вопросе , указанном выше , первым шагом к решению проблемы является использование синтаксиса require() следующим образом:

<img class = "image" :src = "imageSrc" alt = "image">
export default {
  data () {
    return {
      imageSrc: require('@/assets/gallery/images/20211005_0044.jpg')
    }
  }
}

Однако есть еще одна особенность, когда путь в require должен быть динамическим. Согласно этому ответу, Webpack не может импортировать файл, если его имя полностью указано как переменная. Другими словами, require(this.imageSrc) (где imageSrc — строковая переменная) работать не будет.

Обходной путь заключается в том, чтобы включить в переменную только подкаталог (или имя файла) и использовать статический префикс в строке, например:

<img class = "image" :src = "imageSrc" alt = "image">
export default {
  data () {
    return {
      imageName: '20211005_0044.jpg'
    }
  },
  computed: {
    imageSrc () {
      return require(`@/assets/gallery/images/${this.imageName}`);
    }
  }
}

Другие вопросы по теме