React img не сразу меняется при изменении src. Как я могу это исправить?

У меня базовый <img> с src.

<img src = {src} />

Если я изменю src с, скажем, /1.jpg на /2.jpg, а загрузка нового образа займет 1 секунду, React продолжит показывать /1.jpg до тех пор, пока не загрузится новый образ.

Я хочу, чтобы старое изображение было отброшено во время загрузки нового. (например, дисплей: нет)

Есть идеи, как этого добиться? В идеале без условного рендеринга, потому что мне еще нужно использовать onLoad и onError

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

У меня есть кнопка, которая вызывает это onClick

this.props.history.push('/${page + 1}');

Это компонент изображения, где src основан на page из URL-адреса.

import React, { Component } from 'react';
import CenteredLoading from 'components/loading/CenteredLoading';

type Props = { src: string };

type State = {
  status: 'LOADING' | 'LOADED' | 'FAILED',
};

class ImageWithLoader extends Component<Props, State> {
  state = {
    status: 'LOADING',
  };

  handleImageLoad = () => {
    this.setState({ status: 'LOADED' });
    console.error('image loaded');
  };

  handleImageError = () => {
    this.setState({ status: 'FAILED' });
    console.error('image error');
  };

  render() {
    const { src, ...otherProps } = this.props;
    const { status } = this.state;

    return (
      <React.Fragment>
        <img
        {...otherProps}
        onLoad = {this.handleImageLoad}
        onError = {this.handleImageError}
        src = {src}
        />

        {status === 'LOADING' && <CenteredLoading />}
        {status === 'FAILED' && <p>error</p>}
      </React.Fragment>
    );
  }
}

export default ImageWithLoader;

Код? Вы можете изменить это, обновив состояние.

Sachi Tekina 05.06.2018 03:52
Поведение ключевого слова "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) для оценки ваших знаний,...
6
1
3 201
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Сделал свой собственный обходной путь.

Я считаю, что, поскольку response не монтирует новый компонент (например, <img>), он не будет обновляться до нового образа, пока он не завершит загрузку.

Что я сделал, так это проверил, изменился ли src в componentDidUpdate, и изменил статус на LOADING. Затем я установил стиль img на display: none, в то время как его статус был LOADING.

Обновлено: Кроме того, вручную установив свой собственный ключ, я могу заставить React повторно визуализировать <img>

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

<img src = {image_source} key = {image_source}></img>

У меня это не сработало.

AG_HIHI 25.01.2021 09:34

@AhmedGhrib, поделитесь, пожалуйста, своим кодом.

Jahid Hasan 25.01.2021 09:35

Это тот же код, что и вы предложили.

AG_HIHI 25.01.2021 09:38

тогда он должен работать. Возможно, ваш src не меняется. Поделитесь кодом того, как вы меняете свой src и добавляете его в dom.

Jahid Hasan 25.01.2021 09:47

Я действительно обнаружил, что сам URL не меняется. Но в облаке изображение меняется. Так что я думаю, что это другая проблема.

AG_HIHI 25.01.2021 09:52

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