⊗jsrxPmATTRC 55 of 57 menu

Resultaten van thunk werk weergeven in component in Redux

In de vorige les hebben we een POST-verzoek verzonden met behulp van thunk addProduct. Laten we nu de resultaten van zijn werk weergeven in het component.

Laten we onze productenapplicatie openen, en daarin het bestand NewProductForm.jsx, omdat dit component verantwoordelijk is voor het toevoegen van een nieuw product. Laten we kijken naar de import regels. Laten we de import van de action productAdded vervangen door de import van thunk addProduct:

import { addProduct } from './productsSlice'

Nu, omdat we in de slice de status 'pending' van het verzoek niet volgen, laten we het zo maken dat de gebruiker maar één keer op de knop kan klikken om het product op te slaan, want we hebben dezelfde herhaalde verzoeken niet nodig. Hiervoor zullen we nog een lokale state aanmaken:

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

Vervolgens, na de handlers en vóór de functie onSaveProductClick, schrijven we code waarin we controleren of alle velden van het formulier zijn ingevuld en of de status van het verzoek op 'idle' staat:

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

Vervolgens zullen we de code voor onSaveProductClick wijzigen. Ten eerste zal dit een asynchrone functie zijn en deze zal alleen worden uitgevoerd als aan de bovenstaande voorwaarde is voldaan:

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

Ondanks dat we in de slice de status 'rejected' niet volgen, kunnen we toch een fout in de console weergeven, hiervoor gebruiken we de constructie try-catch. Hier voegen we ook finally toe, om na het uitvoeren van het verzoek opnieuw de lokale state in te stellen op 'idle':

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

We hebben de catch en finally blokken behandeld, laten we de code voor het try blok schrijven. Hier stellen we de lokale status in op 'in progress', totdat we een antwoord terugkrijgen als resultaat van het thunk werk, vervolgens sturen we onze thunk addProduct. Het gebruik van de constructie try-catch, afhankelijk van het type antwoord, wordt ons geholpen door de RTK functie unwrap, die het toevoegt aan de geretourneerde promise. Vervolgens, als het verzoek succesvol was, stellen we de lokale states in op hun initiële statussen. De volledige code voor onSaveProductClick ziet er als volgt uit:

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

Laten we onze applicatie starten en proberen een nieuw product toe te voegen. Zoals je ziet, in het geval van een succesvol verzoek worden de velden gewist en wordt het nieuwe product toegevoegd aan de productlijst. Kijk ook in de browser in Redux DevTools en navigeer door de tabbladen, bekijk de actions en hoe je state verandert.

Open je applicatie met studenten. Open daarin het bestand NewStudentForm.jsx. Voeg nog een lokale state requestStatus toe, en stel deze aanvankelijk in op 'idle'. Na bestudering van de lesmaterialen, maak de variabele canBeSaved aan, waarmee de knop voor het opslaan van nieuwe studentgegevens zal werken/niet werken, afhankelijk van de waarde van requestStatus en van de ingevulde velden.

Schrijf asynchrone code voor onSaveStudentClick, die de waarde van requestStatus zal wijzigen naar gelang de situatie, thunk addProduct zal verzenden met de gegevens van de nieuwe student, de velden zal legen in geval van een succesvol verzoek en een fout zal weergeven in de console in geval van mislukking, zoals getoond in de les. Gebruik hiervoor de constructie try-catch en de RTK functie unwrap.

Start je applicatie, voeg een nieuwe student toe en zorg ervoor dat alles werkt.

Nederlands
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Wij gebruiken cookies voor de werking van de site, analyse en personalisatie. De verwerking van gegevens gebeurt volgens het Privacybeleid.
alles accepteren aanpassen weigeren