Устранение дублирования запроса в Redux
Этот урок пригодится нам в том случае, если при запуске приложения у нас дублируется отправка запроса данных, а затем приходят пары продуктов с одинаковыми id, и, как следствие появляются страшные красные ворнинги в консоли браузера.
Причина этого лежит в особенности монтирования
компонентов в React 18 версии и выше в режиме
разработки (dev), при использовании
React.StrictMode (говорят, в режиме production
все ок с этим). Сначала компонент подключается,
потом отключается и снова подключается. Поэтому
и запрос отправляется дважды.
Возможно, когда вы будете изучать этот
материал, это двойное монтирование в
React уже будет изменено каким-то образом.
Мы не будем углубляться в дебри, а просто
пока воспользуемся React хуком useRef,
который нам поможет обойти это недоразумение.
Давайте откроем наше приложение с
продуктами, а в нем файл ProductsList.jsx.
Импортируем в него хук useRef:
import { useEffect, useRef } from 'react'
А теперь немного изменим следующий блок
кода с useEffect:
useEffect(() => {
if (productStatus === 'idle') {
dispatch(fetchProducts())
}
}, [productStatus, dispatch])
Для начала введем новую переменную dataFetch
для useRef. Изначально установим ее свойство
current в false. Если приложение уже
запускалось и, соответственно, запрос был
отправлен, то свойство current уже будет
true, значит мы просто выйдем из функции и
повторного запроса данных не произойдет.
Итак, вышеупомянутый кусочек кода теперь
будет таким:
const dataFetch = useRef(false)
useEffect(() => {
if (dataFetch.current) return
dataFetch.current = true
if (productStatus === 'idle') {
dispatch(fetchProducts())
}
}, [productStatus, dispatch])
Теперь снова запустим наше приложение
и с облегчением отметим исчезновение
красных ворнингов в консоли, и увидим
список продуктов без дублей, теперь
их 8, как мы и запланировали на
сервере. Теперь в Redux DevTools экшены,
генерируемые при запросе, больше не
повторяются.
Откройте ваше приложение со студентами,
а в нем файл StudentsList.jsx. Устраните
проблему с двойным запросом, согласно
материалам урока, если у вас таковая
имеется.