⊗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ščinaShqipSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Користимо колачиће за рад сајта, аналитику и персонализацију. Обрада података се врши у складу са Политиком приватности.
прихвати све подеси одбиј