⊗jsrxPmATER 48 of 57 menu

Dodatni reduktorji v Redux

Odprimo našo aplikacijo s produkti, in v njej datoteko productsSlice.js. Verjetno ste opazili, da smo thunk fetchProducts ustvarili kot ločeno funkcijo? To smo naredili zato, ker createSlice ne podpira definiranja thunkov. Kako naj v tem primeru prisilimo reducer slice products, da se odziva na akcije, ki so definirane zunaj products? Navsezadnje moramo obdelati akcije, ki jih pošilja thunk fetchProducts.

Za takšne primere ima createSlice lastnost extraReducers, ki omogoča dodajanje dodatnih reduktorjev, ki pa bodo obdelovali akcije, definirane ne v tem sliceu.

Dodajmo zdaj v telesu funkcije createSlice za lastnostjo reducers z vsemi reduktorji še eno metodo extraReducers:

extraReducers() {},

Tej metodi moramo posredovati objekt builder, ki ima metode, s pomočjo katerih lahko dodamo dodatne reduktorje:

extraReducers(builder) {},

Uporabili bomo eno od metod builder - addCase, ki kot prvi parameter sprejme ustvarjalca akcije (action creator), kot drugega pa reducer. Ena od akcij, ki jo bo poslal fetchProducts ob zahtevi, je fetchProducts.pending, kar nam pove, da je zahteva poslana. V tem primeru spremenimo status v 'in progress' (pred tem je bil 'idle'):

extraReducers(builder) { builder.addCase(fetchProducts.pending, (state) => { state.status = 'in progress' }) },

Zdaj pa obdelajmo akcijo, ki se pošlje v primeru uspešne zahteve. Tu bomo spremenili ne le status v stanju (state) na 'success', ampak bomo tudi produkte v slice products vzeli iz payload akcije. Da zberemo vse produkte, bomo potrebovali metodo concat:

extraReducers(builder) { builder .addCase(fetchProducts.pending, (state) => { state.status = 'in progress' }) .addCase(fetchProducts.fulfilled, (state, action) => { state.status = 'success' state.products = state.products.concat(action.payload) }) },

V primeru neuspešne zahteve bomo spremenili status na 'fail' in v stanje (state) zapisali sporočilo o napaki:

.addCase(fetchProducts.rejected, (state, action) => { state.status = 'fail' state.error = action.error.message })

Če zdaj zaženemo našo aplikacijo in v meniju kliknemo na 'Products', potem bomo čez nekaj sekund (se spomnite zamika, ki smo ga nastavili na strežniku?) videli seznam s produkti.

Prav tako bomo videli spremembe tudi v Redux DevTools. Zdaj se bodo naši produkti pojavili tudi v stanju (state) (poglejte zavihek 'State'), če ste kliknili na akcijo products/fetchProducts/fulfilled. Pojavil se bo tudi nov status 'success'. Kliknite zdaj na akcijo products/fetchProducts/pending in poglejte, kaj je zdaj drugače na zavihku 'State'.

Edini neprijeten trenutek, ki se vam lahko zgodi (o tem sem govoril v prejšnji lekciji) - je podvajanje zahteve za podatke. Posledično bi imeli na seznamu ne 8, ampak celo 16 produktov in kritična opozorila v konzoli razvijalca. Ugotovimo kaj s tem v naslednji lekciji.

Odprite vašo aplikacijo s študenti. Odprite v njej datoteko studentsSlice.js. V telesu funkcije createSlice za lastnostjo reducers dodajte lastnost extraReducers. Posredujte metodi extraReducers builder.

Z metodo builder.addCase dodajte obdelavo za akcije pending, fulfilled in rejected, ki jih pošilja fetchStudents ob zahtevi podatkov, kot je prikazano v lekciji.

Slovenščina
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Za delovanje spletnega mesta, analitiko in personalizacijo uporabljamo piškotke. Obdelava podatkov poteka v skladu s Politiko zasebnosti.
sprejmi vse nastavi zavrni