Остановка forEach при изменении свойства (ReactJS, Redux)

Так что я не уверен в том, как это сделать наиболее эффективно, и правильно ли я к нему подхожу.

У меня есть приложение, которое захватывает длинный массив URL-адресов изображений (800+) в то время как props.loading = true и загружает эти изображения в другой массив. Затем, когда я воспроизводю слайд-шоу, созданное этими изображениями, я пытаюсь понять, как остановить загрузку изображений внутри forEach. Вот мой фрагмент изображений:

getImages = () => {
     this.props.links.forEach(url => {
         const img = document.createElement('img');
         img.src = url;
         img.onload = () => {
              store.dispatch(addImage(img));
         } 
     })
}

Есть ли способ использовать componentDidUpdate или другой подход, чтобы отключить forEach при this.props.loading = true? Меня больше всего беспокоит производительность - без ожидания загрузки всех изображений получающееся слайд-шоу сильно тормозит, но воспроизводится без проблем после того, как все загружено.

Поведение ключевого слова "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
0
55
2

Ответы 2

В componentDidUpdate вы можете использовать prevProps для сравнения с this.props:

componentDidUpdate(prevProps) {
  if (prevProps.links.length === this.props.links.length) {
    // links array length did not change
  }
}

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

Извините, возможно, я просил не то. Я предварительно загружаю все URL-адреса (асинхронно), затем запускаю загрузчик изображений. Я хочу иметь возможность убить загрузчик образов для каждого по желанию, если this.props.loading = false. Уже используется то, что вы опубликовали, для запуска предварительного загрузчика URL!

Isaac Doud 28.11.2018 19:30

Ах я вижу. Я не уверен, как это можно остановить - cDU запускается при изменении свойств, поэтому простая условная проверка «перезапустит» cDU (я полагаю). Мне кажется, что более серьезной проблемой для меня является то, что если бы вы «остановили» его, вы потенциально запускали диспетчеризацию больше раз, чем необходимо, но мне может не хватать того, что делает или для чего предназначен ваш код.

Toby 28.11.2018 19:40

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

Также знайте, что componentDidUpdate () запускается только после функции рендеринга.

  • Вы можете попробовать отложить загрузку изображений кусками в галерею с помощью реагировать на ленивую загрузку или нового React Suspense API вместо загрузки изображений в forEach. Таким образом, в вашей галерее не будет всей предварительной логики для вычислений. Конечно, это может не сработать для вашего варианта использования, если вам действительно нужны все эти изображения в магазине.

  • Вы можете попытаться использовать shouldComponentUpdate() для реализации некоторой логики, если компонент действительно должен согласовать и повторно отрисовать, но это все равно не будет учитывать начальную загрузку, а только последующие загрузки. Вам также необходимо убедиться, что вы не отправляете действия для изображений, которые уже находятся в магазине.

    shouldComponentUpdate(nextProps, nextState){
        if (this.props.loading && !nextProps.loading){
            return true
        } else {
            return false
        }
    }
    

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