Проблема загрузки изображения с vue

Эта проблема может быть не специфичной для vue, но вот ...

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

<img :src = "'https://external-site.com/photos/' + item.name + '.jpg'" />

Когда я ищу первый элемент, он возвращает элемент с изображением и деталями. Но всякий раз, когда я ищу второй элемент, он возвращает правильную информацию, но использует кешированное изображение последнего элемента, пока не загрузится его собственное изображение.

Я решил использовать некоторые события в изображении, чтобы показать загрузчик перед тем, как они начнут загружаться, но я обнаружил только три события, специфичных для изображений: onabort, onerror, onload.

Но мне нужно событие, чтобы показать загрузчик в начале загрузки образа. Если нет, есть ли другой способ решить эту проблему?

Поскольку изображения являются внешними и загружаются медленно, рассмотрите возможность их ленивой загрузки markus.oberlehner.net/blog/…

estinamir 16.12.2018 19:24
Поведение ключевого слова "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) для оценки ваших знаний,...
4
1
4 599
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Обычный прием для победы над кешем - добавить к вашему URL-адресу безобидный изменяющийся параметр, например временную метку:

<img :src = "'https://external-site.com/photos/' + item.name + '.jpg?x=' + Date.now()" />

Параметр не должен мешает доступу к изображению, но браузер не предполагает, что URL-адрес такой же.

Это все еще не работает. Кешированное изображение остается, пока не загрузится другое изображение.

chinloyal 16.12.2018 17:51

Хм. может сначала указать на известное локальное изображение, которое будет указывать на «загрузку», а затем перейти на новый URL-адрес?

Jim B. 16.12.2018 17:54
Ответ принят как подходящий

Я решил проблему, используя прогрессивный рендеринг изображений с помощью vue:

Сначала я установил пакет, который дал мне компонент v-lazy-image от npm i v-lazy-image. затем я импортировал компонент

<script>
import VLazyImage from "v-lazy-image";

export default {
  components: {
    VLazyImage
  }
};
</script>

Затем компонент позволяет указать изображение и изображение-заполнитель, которое будет использоваться при загрузке изображения:

<v-lazy-image
  :src = "'https://external-site.com/photos/' + item.name + '.jpg'"
  src-placeholder = "/images/default.jpg"
  />

Вы можете увидеть более подробную информацию об этом компоненте здесь

У меня была точно такая же проблема. И ни один из предыдущих ответов не решил мою проблему.

В методе, который изменяет сведения о ваших элементах и ​​ссылку на изображения (например: changeDetails ()), сделайте резервную копию вашего реального пути к изображению (impath) в (impath_b) и установите для пути к изображению значение null. Vue.js нарисует прозрачное изображение, и через 100 мс реальный путь к изображению (impath) будет восстановлен.

changeDetails() {
    // for ...
    item.impath_b = item.impath; // it's not necessary declare impath_b before.
    item.impath = null;
    // ...

    // just before the method ends:
    setTimeout(function () {
        vm.revertImages();
    }, 100);
},
revertImages() {
    // for ...
    item.impath = item.impath_b;
    item.impath_b = null;
}

В коде html покажите изображение только тогда, когда оно не равно нулю:

<img v-if = "item.file!=null" :src = "item.file"/>
<img v-else :src = "transpGif"/>

Определите transpGif в вашей области переменных:

transpGif: 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==',

подробнее об этом transpGif здесь.

Идея состоит в том, чтобы очистить и перерисовать изображения с пустым изображением, а затем новое изображение будет нарисовано при загрузке.

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