⊗jsrxPmATER 48 of 57 menu

Papildomi Redukseriai Redux

Atidarykime mūsų produktų aplikaciją, o joje failą productsSlice.js. Tikriausiai jūs pastebėjote, kad thunk fetchProducts sukūrėme kaip atskirą funkciją? Taip padarėme, nes createSlice nepalaiko thunk apibrėžimo. Kaip mums šiuo atveju priversti sluoksnio products redukserį reaguoti į veiksmus, kurie yra apibrėžti už products ribų? Juk mums reikia apdoroti veiksmus, kuriuos siunčia thunk fetchProducts.

Tokiais atvejais createSlice turi savybę extraReducers, kuri leidžia pridėti papildomus redukserius, kurie savo ruožtu ir apdoros veiksmus, apibrėžtus ne šiame sluoksnyje.

Dabar funkcijos createSlice kūne po savybės reducers su visais redukseriais pridėkime dar vieną metodą extraReducers:

extraReducers() {},

Šiam metodui turime perduoti objektą builder, kuris turi metodus, su kurių pagalba galima pridėti papildomus redukserius:

extraReducers(builder) {},

Mes naudosime vieną iš builder metodų - addCase, kuris pirmu parametru priima veiksmo kūrėją, o antruoju - redukserį. Vienas iš veiksmų, kurį mums siųs fetchProducts užklausos metu, yra fetchProducts.pending, kuris mums rodo, kad užklausa išsiųsta. Šiuo atveju pakeiskime statusą į 'in progress' (iki šiol jis buvo 'idle'):

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

Dabar apdorokime veiksmą, kuris bus išsiųstas sėkmingos užklausos atveju. Čia mes pakeisime ne tik statusą stetyje į 'success', bet ir paimsime produktus į sluoksnį products iš veiksmo payload. Kad surinktume visus produktus, mums prireiks 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) }) },

Nesėkmingos užklausos atveju pakeisime statusą į 'fail' ir į stetą įrašysime klaidos pranešimą:

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

Jei mes dabar paleisime mūsų aplikaciją ir meniu spustelėsime 'Products', tai po poros sekundžių (prisimenate delą, kurį nustatėme serveryje?) pamatysime produktų sąrašą.

Taip pat pamatysime pakeitimus ir Redux DevTools. Dabar mūsų produktai pasirodys ir stetyje (pažiūrėkite skirtuką 'State'), jei spustelėjote veiksmą products/fetchProducts/fulfilled. Ten taip pat pasirodys ir naujas statusas 'success'. Dabar spustelėkite veiksmą products/fetchProducts/pending ir pažiūrėkite, kuo skiriasi skirtukas 'State'.

Vienintelis nemalonus momentas, kuris jums gali atsitikti (apie tai kalbėjau ankstesnėje pamokoje) - tai duomenų užklausos dubliavimasis. Dėl to mūsų sąraše gausime ne 8, o visus 16 produktų ir kritinius įspėjimus plėtotojo konsolėje. Spręskime šią problemą kitoje pamokoje.

Atidarykite savo studentų aplikaciją. Atidarykite joje failą studentsSlice.js. Funkcijos createSlice kūne po savybės reducers pridėkite savybę extraReducers. Perduokite metodui extraReducers builder.

Naudodami metodą builder.addCase pridėkite apdorojimą veiksmams pending, fulfilled ir rejected, kuriuos siunčia fetchStudents užklausos metu, kaip parodyta pamokoje.

Lietuvių
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Mes naudojame slapukus svetainės veikimui, analizei ir personalizavimui. Duomenų apdorojimas vyksta pagal Privatumo politiką.
priimti visus nustatyti atšaukti