Устранение дублирования запроса в 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. Устраните проблему с двойным запросом, согласно материалам урока, если у вас таковая имеется.



Чат с GPT Компилятор