Отправка thunk из компонента в Redux

На этом уроке мы отправим thunk для получения продуктов из из React-компонента ProductsList.

Давайте теперь откроем наше приложение с продуктами, а в нем файл ProductsList.jsx. Для начала добавим к импорту thunk fetchProducts, который мы создали:

import { selectAllProducts, fetchProducts } from './productsSlice'

Также нам понадобится хук useDispatch для отправки нашего action creator и хук useEffect потому что здесь у нас 'побочный эффект', поскольку мы имеем дело с сеткой, а это уже внешний API:

import { useEffect } from 'react' import { useSelector, useDispatch } from 'react-redux'

Теперь первой строчкой в коде функции ProductsList перед объявлением products добавим:

const dispatch = useDispatch()

Далее при получении продуктов из стейта мы еще будем извлекать статус запроса:

const products = useSelector(selectAllProducts) const productStatus = useSelector((state) => state.products.status)

И сразу после этого скажем React при помощи хука useEffect, что нам после отрисовки компонента необходимо получить продукты. Здесь нам и понадобится статус запроса, ведь нам важно, чтобы такой запрос отправлялся только один раз:

useEffect(() => { if (productStatus === 'idle') { dispatch(fetchProducts()) } }, [productStatus, dispatch])

Сейчас мы можем запустить наше приложение, кликнуть в нем по 'Products' в меню слева. Список продуктов мы пока не увидим, но если мы зайдем в наш Redux DevTools, то в левой части окошечка у нас появятся сгенерированные автоматически (как я и говорил в прошлом уроке) экшены products/fetchProducts/pending и fulfilled. Теперь давайте кликнем по action products/fetchProducts/fulfilled и по его полю payload - вот и наш списочек продуктов! Ура, все наши звенья в цепочке - сервер, база, клиент и Redux - приложение работают слаженно и сообща. Кстати, как видите здесь еще есть свойство meta, в котором мы видим статус запроса.

Обратим внимание на еще одну вещь, у вас может случиться так, что pending и, следовательно, fulfilled будут отображаться по два раза. Если это так, то не огорчайтесь, мы поговорим об этом позже.

Откройте ваше приложение со студентами. Откройте в нем файл StudentsList.jsx. Импортируйте в него необходимые хуки и thunk согласно материалу из урока.

Изучив материалы урока, получите статус запроса studentStatus, а затем, используя useEffect, отправьте fetchStudents только при условии, что значение studentStatus - 'idle'.

Запустите ваше приложение, кликните в меню приложения слева по 'Students', а затем запустите в браузере расширение Redux DevTools, как и в данном уроке вы должны увидеть экшены с pending и fulfilled (а в нем payload со студентами). Полазьте по вкладкам расширения.



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