⊗jsrxPmATTRC 55 of 57 menu

A thunk működésének eredményeinek megjelenítése komponensben a Redux-ban

Az előző órán elküldtünk egy POST-kérelmet a addProduct thunk segítségével. Most jelenítsük meg a működésének eredményeit a komponensben.

Nyissuk meg a termékalkalmazásunkat, és benne a NewProductForm.jsx fájlt, mivel ez a komponens felelős az új termék hozzáadásáért. Nézzük meg az import sorokat. Cseréljük le a productAdded action importját a addProduct thunk importjára:

import { addProduct } from './productsSlice'

Most, mivel a slice-ban nem követjük a kérés 'pending' állapotát, tegyük úgy, hogy a felhasználó csak egyszer kattinthasson a termék mentése gombra, hiszen nincsenek szükségünk ugyanazokra az ismétlődő kérésekre. Ehhez hozzunk létre még egy lokális állapotot:

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

Ezután a kezelők után és a onSaveProductClick függvény előtt írjuk meg a kódot, amelyben ellenőrizzük, hogy minden mező ki van-e töltve és a kérés állapota 'idle'-e:

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

Majd módosítjuk a onSaveProductClick kódját. Először is ez egy aszinkron függvény lesz, és csak akkor hajtódik végre, ha a fenti feltétel igaz:

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

Annak ellenére, hogy a slice-ban nem követjük a 'rejected' állapotot, kiírhatjuk a hibát a konzolra, ehhez használjuk a try-catch konstrukciót. Itt hozzáadunk egy finally részt is, hogy a kérés végrehajtása után visszaállítsuk a lokális állapotot 'idle'-ra:

const onSaveProductClick = async () => { if (canBeSaved) { try { } catch (err) { console.error('Termék mentési hiba: ', err) } finally { setRequestStatus('idle') } } }

A catch és finally blokkokkal megvagyunk, most írjuk meg a kódot a try blokkhoz. Itt beállítjuk a lokális állapotot 'in pogress'-re, amíg nem kapunk valamilyen választ a thunk működése eredményeképpen, majd elküldjük a addProduct thunk-ot. A try-catch konstrukció használatához a válasz típusától függően az RTK unwrap függvénye segít, amelyet hozzáad a visszaadott promise-hoz. Majd, ha a kérés sikeres volt, visszaállítjuk a lokális állapotokat kezdeti értékeikre. A teljes kód a onSaveProductClick-hoz így fog kinézni:

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('Termék mentési hiba: ', err) } finally { setRequestStatus('idle') } } }

Indítsuk el az alkalmazásunkat és próbáljunk hozzáadni egy új terméket. Amint látható, sikeres kérés esetén a mezők kiürülnek és az új termék hozzáadódik a terméklistához. Nézzük meg a böngészőben a Redux DevTools-ot is, kattintsunk a lapjai között, nézzük meg az action-öket és hogyan változik az állapot.

Nyisd meg a diák alkalmazásodat. Nyisd meg benne a NewStudentForm.jsx fájlt. Adj hozzá még egy lokális állapotot requestStatus, és állítsd be kezdetben 'idle'-ra. A lecke anyagának megismerése után hozz létre egy canBeSaved változót, amellyel a diák új adatainak mentése gombja működni fog/nem fog, a requestStatus értékétől és a mezők kitöltöttségétől függően.

Írj aszinkron kódot a onSaveStudentClick-hoz, ami megváltoztatja a requestStatus értékét a helyzettől függően, elküldi a addProduct thunk-ot az új diák adataival, üríti a mezőket sikeres kérés esetén és kiírja a konzolra a hibát sikertelenség esetén, ahogyan a leckében is láttuk. Használd ehhez a try-catch konstrukciót és az RTK unwrap függvényét.

Indítsd el az alkalmazásodat, adj hozzá egy új diákot és győződj meg róla, hogy minden működik.

Magyar
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
A weboldal működéséhez, elemzéshez és személyre szabáshoz sütiket használunk. Az adatfeldolgozás a Adatvédelmi irányelvek szerint történik.
összes elfogadása beállítás elutasítás