Применение статуса запроса в Redux

На прошлых занятиях мы с помощью дополнительных редьюсеров описали, что делать нашему приложению, если fetchProducts отправляет при запросе экшены pending, fulfilled и rejected. Теперь мы можем показать пользователю на какой стадии сейчас загрузка данных.

Давайте откроем наше приложение с продуктами, а в нем файл ProductsList.jsx. Первое, что мы сделаем, это создадим отдельный компонент для карточки продукта ProductCard. Сделаем это сразу после строчек импорта перед функцией ProductsList. В качестве пропса передадим ему product:

const ProductCard = ({ product }) => { return () }

А теперь в пустые круглые скобочки return перенесем весь код для отображения данных продукта из dispProducts:

const ProductCard = ({ product }) => { return ( <div key={product.id} className="product-excerpt"> <h3>{product.name}</h3> <SellerOfProd sellerId={product.seller} /> <p>{product.desc.substring(0, 100)}</p> <UserReactions product={product} /> <Link to={`/products/${product.id}`} className="link-btn"> view </Link> </div> ) }

И уберем в ProductsList оставшуюся строчку кода. Она нам больше не нужна:

const dispProducts = products.map((product) => ())

А теперь в начале кода функции ProductsList заведем еще пару переменных, error и content. Первая у нас будет для ошибки, во вторую мы будем записывать то или иное содержимое в зависимости от статуса запроса. Сделаем это перед const dataFetch = useRef(false):

const error = useSelector((state) => state.products.error) let content

Теперь перед командой return компонента ProductsList напишем блок кода с условиями, при которых в content будет заноситься то или иное содержимое в зависимости от статуса. Первым мы опишем статус 'in progress' - когда наш запрос отправлен. В этом случаем мы сообщим пользователю, что идет загрузка данных:

if (productStatus === 'in progress') { content = <p>Products list loading ...</p> }

Если наша загрузка прошла успешно (мы обозначали это как 'success'), то нам нужно вывести список полученных продуктов. Выведем его в map при помощи компонента ProductCard, которому пропсом передадим product:

if (productStatus === 'in progress') { content = <p>Products list loading ...</p> } else if (productStatus === 'success') { content = products.map((product) => ( <ProductCard key={product.id} product={product} /> )) }

И последний статус, который у нас имеется - это 'fail'. Добавим и его. Используем здесь переменную error, в которую мы выше записали ошибку из стейта:

if (productStatus === 'in progress') { content = <p>Products list loading ...</p> } else if (productStatus === 'success') { content = products.map((product) => ( <ProductCard key={product.id} product={product} /> )) } else if (productStatus === 'fail') { content = <div>{error}</div> }

И последним шагом мы в блоке кода для return заменим старый {dispProducts} на {content}.

Запустим наше приложение, кликнем в меню по 'Products'. Все работает. Видим, что примерно 2 секунды (как мы и установили на сервере) у нас под формой добавления продукта висит надпись 'Products list loading ...', а потом появляется список продуктов.

Откройте ваше приложение со студентами. Откройте в нем файл StudentsList.jsx. Создайте в нем новый компонент StudentCard. Перенесите в него код из dispStudents, как показано в уроке.

Создайте в функции StudentsList переменные error и content. Присвойте переменной content содержимое в зависимости от статуса запроса. Не забудьте заменить в возвращаемой верстке старый dispStudents на content.



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