⊗jsrxPmATTRC 55 of 57 menu

Visning af thunk-resultater i en komponent i Redux

I den forrige lektion sendte vi en POST-forespørgsel ved hjælp af thunken addProduct. Lad os nu visse resultaterne af dens arbejde i komponenten.

Åbn vores applikation med produkter, og i den filen NewProductForm.jsx, da dette komponent er ansvarlig for at tilføje et nyt produkt. Lad os se på import-linjerne. Lad os erstatte importen af actionen productAdded med importen af thunken addProduct:

import { addProduct } from './productsSlice'

Nu, da vi ikke sporer status 'pending' for forespørgslen i slicen, lad os gøre det sådan, at brugeren kun kan klikke på knappen til at gemme produktet én gang, da vi ikke har brug for de samme gentagne forespørgsler. For at gøre dette opretter vi endnu en lokal state:

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

Dernæst, efter behandlerne og før funktionen onSaveProductClick, skriver vi kode, hvor vi kontrollerer, om alle formularfelter er udfyldt og om forespørgselsstatusen er 'idle':

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

Derefter ændrer vi koden for onSaveProductClick. For det første vil dette være en asynkron funktion, og den vil kun udføres, hvis betingelsen ovenfor er sand:

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

På trods af at vi ikke sporer status 'rejected' i slicen, kan vi alligevel vise fejlen i konsollen, for at gøre dette bruger vi konstruktionen try-catch. Her tilføjer vi også finally, så vi efter udførelsen af forespørgslen igen sætter den lokale state til 'idle':

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

Vi har behandlet catch og finally blokkene, lad os skrive koden for try blokken. Her sætter vi den lokale status til 'in pogress', indtil vi får et svar tilbage som et resultat af thunkens arbejde, og sender derefter vores thunk addProduct. For at bruge konstruktionen try-catch afhængigt af svartypen vil RTK-funktionen unwrap hjælpe os, som den tilføjer til den returnerede promise. Derefter, hvis forespørgslen var succesfuld, sætter vi de lokale states til deres oprindelige tilstande. Den fulde kode for onSaveProductClick vil se sådan ud:

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') } } }

Lad os starte vores applikation og prøve at tilføje et nyt produkt. Som du kan se, ved en succesfuld forespørgsel ryddes felterne, og det nye produkt tilføjes til produktlisten. Kig også i browseren i Redux DevTools og gennemgå dens faner, se på actions og hvordan din state ændrer sig.

Åbn din applikation med studerende. Åbn filen NewStudentForm.jsx i den. Tilføj endnu en lokal state requestStatus, og sæt den oprindeligt til 'idle'. Efter at have gennemgået lektionens materiale, opret variablen canBeSaved, ved hjælp af hvilken knappen til at gemme nye studerendedata vil virke/ikke virke, afhængigt af værdien af requestStatus og om felterne er udfyldt.

Skriv asynkron kode for onSaveStudentClick, som vil ændre værdien af requestStatus efter situationen, sende thunken addProduct med data for den nye studerende, rydde felter ved en succesfuld forespørgsel og vise fejlen i konsollen ved fiasko, som vist i lektionen. Brug til dette konstruktionen try-catch og RTK-funktionen unwrap.

Start din applikation, tilføj en ny studerende og vær sikker på, at alt fungerer.

Dansk
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDeutschΕλληνικά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
Vi bruger cookies til webstedets funktion, analyse og personalisering. Behandling af data foregår i henhold til Fortrolighedspolitikken.
accepter alle tilpas afvis