⊗jsrxPmATTRC 55 of 57 menu

Показване на резултатите от работата на thunk в компонент в Redux

В предишния урок изпратихме POST заявка с помощта на thunk addProduct. Нека сега покажем резултатите от неговата работа в компонента.

Нека отворим нашето приложение с продукти, а в него файла NewProductForm.jsx, тъй като този компонент е отговорен за добавяне на нов продукт. Нека разгледаме редовете с импорти. Нека заменим импорта на екшъна productAdded, с импорт на thunk addProduct:

import { addProduct } from './productsSlice'

Сега, тъй като не проследяваме в слайса статуса 'pending' на заявката, нека направим така, че потребителят да може да натисне бутона за запазване на продукта само веднъж, тъй като не ни трябват едни и същи повторни заявки. За целта ще създадем още един локален стейт:

const [requestStatus, setRequestStatus] = useState('idle')

След това след обработвачите и преди функцията onSaveProductClick ще напишем код, в който проверяваме дали всички полета на формата са попълнени и дали статусът на заявката е 'idle':

const canBeSaved = [name, desc, price, amount, sellerId].every(Boolean) && requestStatus === 'idle'

След това ще променим кода за onSaveProductClick. Първо, това ще бъде асинхронна функция и тя ще се изпълнява, ако горното условие е вярно:

const onSaveProductClick = async () => { if (canBeSaved) {} }

Въпреки че в слайса не проследяваме статуса 'rejected', все пак можем да изведем грешка в конзолата, за целта ще използваме конструкцията try-catch. Също така тук ще добавим и finally, за да върнем след изпълнението на заявката локалния стейт в 'idle':

const onSaveProductClick = async () => { if (canBeSaved) { try { } catch (err) { console.error(save product error: , err) } finally { setRequestStatus('idle') } } }

С catch и finally блоковете се справихме, нека напишем кода за блока try. Тук ще зададем локалния статус на 'in pogress', докато не получим някакъв отговор в резултат от работата на thunk, след това ще изпратим нашия thunk addProduct. Използването на конструкцията try-catch в зависимост от типа на отговора ще ни помогне функцията RTK unwrap, която се добавя към върнатия промис. След това, ако заявката е успешна, задаваме локалните стейтове в началните им състояния. Пълният код за onSaveProductClick ще изглежда така:

const onSaveProductClick = async () => { if (canBeSaved) { try { setRequestStatus('in progress') await dispatch( addProduct({ name, desc, price, amount, seller: sellerId })).unwrap() setName('') setDesc('') setPrice(0) setAmount(0) setSellerId('') } catch (err) { console.error('save product error: ', err) } finally { setRequestStatus('idle') } } }

Нека стартираме нашето приложение и да опитаме да добавим нов продукт. Както виждате, в случай на успешна заявка полетата се изчистват и новият продукт се добавя в списъка с продукти. Също така погледнете в браузъра в Redux DevTools и разгледайте разделите му, вижте екшъните и как се променя вашият стейт.

Отворете вашето приложение със студенти. Отворете в него файла NewStudentForm.jsx. Добавете още един локален стейт requestStatus, и задайте първоначалната му стойност на 'idle'. След като се запознаете с материала от урока, създайте променлива canBeSaved, с помощта на която бутонът за запазване на новите данни за студента ще работи/не работи, в зависимост от стойността на requestStatus и от това дали полетата са попълнени.

Напишете асинхронен код за onSaveStudentClick, който ще променя стойността на requestStatus според ситуацията, изпраща thunk addProduct с данните за новия студент, изчиства полетата в случай на успешна заявка и извежда грешка в конзолата в случай на неуспех, както е показано в урока. Използвайте за целта конструкцията try-catch и функцията RTK unwrap.

Стартирайте вашето приложение, добавете нов студент и се уверете, че всичко работи.

Български
AfrikaansAzərbaycanবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Ние използваме бисквитки за работата на сайта, анализ и персонализация. Обработката на данни се извършва в съответствие с Политика за поверителност.
приемам всички настройки отхвърляне