⊗jsrxPmATER 48 of 57 menu

Bykomende Reduseerders in Redux

Kom ons maak ons aansoek met produkte oop, en daarin die lêer productsSlice.js. Jy het seker opgemerk dat ons die thunk fetchProducts as 'n aparte funksie geskep het? Ons het dit so gedoen omdat createSlice nie die definisie van thunks ondersteun nie. Hoe kan ons in hierdie geval die reduseerder van die products sny reageer op aksies wat buite die products sny gedefinieer is? Ons moet immers die aksies hanteer wat deur die thunk fetchProducts gestuur word.

Vir sulke gevalle het createSlice die eienskap extraReducers, wat toelaat om bykomende reduseerders by te voeg, wat op hul beurt die aksies sal hanteer wat nie in hierdie sny gedefinieer is nie.

Kom ons voeg nou in die liggaam van die funksie createSlice na die eienskap reducers met al die reduseerders 'n ekstra metode extraReducers by:

extraReducers() {},

Aan hierdie metode moet ons 'n objek builder oorhandig, wat metodes het waarmee jy bykomende reduseerders kan byvoeg:

extraReducers(builder) {},

Ons sal een van die metodes van builder gebruik - addCase, wat as eerste parameter 'n action creator aanvaar, en as tweede 'n reduseerder. Een van die aksies wat deur fetchProducts gestuur sal word tydens die versoek is fetchProducts.pending, wat vir ons sê dat die versoek gestuur is. Kom ons verander in hierdie geval die status na 'in progress' (voorheen was dit 'idle'):

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

Laat ons nou die aksie hanteer wat gestuur word in die geval van 'n suksesvolle versoek. Hier sal ons nie net die status in die staat verander na 'success' nie, maar ook die produkte in die products sny uit die payload van die aksie haal. Om al die produkte bymekaar te maak sal ons die metode concat nodig hê:

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

In die geval van 'n mislukte versoek sal ons die status verander na 'fail' en in die staat 'n foutboodskap aanteken:

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

As ons nou ons aansoek begin en in die menu op 'Products' klik, dan sal ons na 'n paar sekondes (onthou jy die vertraging wat ons op die bediener gestel het?) 'n lys met produkte sien.

Net so sal ons die veranderinge in Redux DevTools sien. Nou sal ons produkte ook in die staat verskyn (kyk na die oortjie 'State'), as jy op die aksie products/fetchProducts/fulfilled geklik het. Daar sal ook die nuwe status 'success' verskyn. Klik nou op die aksie products/fetchProducts/pending en kyk hoe die oortjie 'State' nou anders lyk.

Die enigste onpleasante oomblik wat vir jou mag gebeur (ek het daaroor gepraat in die vorige les) - is die duplisering van data versoeke. As gevolg daarvan sal ons in die lys nie 8 nie, maar heelwat 16 produkte hê en kritieke waarskuwings in die ontwikkelaarskonsole. Kom ons los dit in die volgende les op.

Maak jou aansoek met studente oop. Maak daarin die lêer studentsSlice.js oop. In die liggaam van die funksie createSlice voeg na die eienskap reducers die eienskap extraReducers by. Handig aan die metode extraReducers die builder oor.

Gebruik die metode builder.addCase om hantering by te voeg vir die aksies pending, fulfilled en rejected, wat deur fetchStudents gestuur word tydens data versoeke, soos in die les gewys.

Afrikaans
AzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικά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
Ons gebruik koekies vir die werking van die webwerf, ontleding en personalisering. Die verwerking van data geskied volgens die Privaatheidsbeleid.
aanvaar alles instel verwerp