⊗jsrxPmATInr 45 of 57 menu

Inleiding tot thunks in Redux

In het vorige hoofdstuk hebben we de werking van de server, database en client voor gegevensuitwisseling georganiseerd. Nu moeten we de laatste brug slaan, die ons 'synchroon' georganiseerde Redux applicatie zal helpen om te interageren met de asynchrone client, die we in de laatste les van het vorige hoofdstuk hebben gemaakt, om verzoeken te verzenden en de benodigde gegevens in het antwoord te ontvangen.

Zoals we ons herinneren uit de eerste lessen van de vorige sectie, weet Redux niets af van het werken met asynchrone logica en daarvoor zullen we thunk middleware gebruiken. Deze middleware maakt het mogelijk om met verzonden actions te werken, om in de code van onze thunk de dispatch en getState methoden van de store te gebruiken, en helpt de dispatch methode om niet alleen met gewone JS-objecten te werken, maar ook met entiteiten zoals functies en promises.

Normaal gesproken wordt een thunk-functie aangeroepen met twee argumenten: dispatch en getState (indien nodig), die kunnen worden gebruikt in het lichaam van deze functie. Met behulp daarvan kan men gewone actions verzenden. Ook kan deze worden verzonden via store.dispatch. Een voorbeeld van zo'n functie staat hieronder:

const changeColorThunk = (dispatch, getState) => { const colorBefore = getState() console.log(`Oude Kleur: ${colorBefore.color}`) dispatch(changeColor()) const colorAfter = getState() console.log(`Nieuwe Kleur: ${colorAfter.color}`) } store.dispatch(changeColorThunk)

Laten we nu onze applicatie met producten openen. Het eerste dat we moeten ontvangen van de server bij het opstarten van de applicatie - is de lijst met producten. Omdat thunks meestal in slice-bestanden worden geschreven, openen we het bestand productsSlice.js.

Het goede nieuws is dat we niet hoeven te sleutelen aan de installatie van Redux Thunk, omdat de functie configureStore uit RTK dit al voor ons doet. Dus laten we gewoon createAsyncThunk toevoegen aan de import in het bestand:

import { createSlice, nanoid, createAsyncThunk } from '@reduxjs/toolkit'

Laten we ook onze client importeren:

import { client } from '../../api/client'

En laten we nu met behulp van createAsyncThunk onze eerste thunk maken voor het ophalen van producten, we doen dit direct na de declaratie van het object initialState:

export const fetchProducts = createAsyncThunk()

De eerste parameter van createAsyncThunk zal een string accepteren voor het type gegenereerde action, en de tweede - een callback-functie voor de payload, die als resultaat ofwel gegevens, of een promise met een fout zal teruggeven (zie bestand client.js). In de code van de functie roepen we client.get aan en geven we het pad door, dat we op de server hebben opgegeven (bekijk de geaccepteerde parameters van http.get in server.js):

export const fetchProducts = createAsyncThunk( 'products/fetchProducts', async () => { const response = await client.get('/fakeServer/products') return response.data } )

Open je applicatie met studenten. Open daarin het bestand studentsSlice.js. Importeer daarin de functie createAsyncThunk voor het aanmaken van een thunk, en ook client voor het verzenden van API-verzoeken naar de server.

Direct na de declaratie van het object initialState maak je met createAsyncThunk een thunk aan genaamd fetchStudents voor het ophalen van de studentenlijst, die een GET-verzoek zal verzenden naar adres /fakeServer/students, zoals opgegeven in je bestand server.js, en zal terugkeren met response.data, zoals getoond in de lesmaterialen. Geef als eerste parameter aan createAsyncThunk de string students/fetchStudents op voor het action type.

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