⊗jsrxPmATER 48 of 57 menu

Doplnkové reducery v Reduxe

Otvorme našu aplikáciu s produktmi, a v nej súbor productsSlice.js. Pravdepodobne ste si všimli, že sme vytvorili thunk fetchProducts ako samostatnú funkciu? Urobili sme to preto, lebo createSlice nepodporuje definíciu thunks. Ako v tomto prípade môžeme prinútiť reducer slice products reagovať na akcie, ktoré sú definované mimo products? Veď práve potrebujeme spracovať akcie, ktoré posiela thunk fetchProducts.

Pre takéto prípady má createSlice vlastnosť extraReducers, ktorá umožňuje pridať doplnkové reducery, ktoré naopak budú spracovávať akcie, definované nie v tomto slice.

Teraz v tele funkcie createSlice po vlastnosti reducers so všetkými reducermi pridajme ešte jednu metódu extraReducers:

extraReducers() {},

Tejto metóde musíme odovzdať objekt builder, ktorý má metódy, s ktorými je možné pridať doplnkové reducery:

extraReducers(builder) {},

Budeme používať jednu z metód builder - addCase, ktorá ako prvý parameter prijíma action creator, a ako druhý reducer. Jedna z akcií, ktorú nám bude odosielať fetchProducts pri požiadavke je fetchProducts.pending, čo nám hovorí o tom, že požiadavka bola odoslaná. V tomto prípade zmeňme stav na 'in progress' (predtým bol 'idle'):

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

Teraz spracujme akciu, ktorá sa odošle v prípade úspešnej požiadavky. Tu budeme meniť nielen stav v stave na 'success', ale aj zoberieme produkty do slice products z payload akcie. Aby sme zhromaždili všetky produkty, budeme potrebovať metódu 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 prípade neúspešnej požiadavky zmeníme stav na 'fail' a zapíšeme do stavu správu o chybe:

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

Ak teraz spustíme našu aplikáciu a v menu klikneme na 'Products', tak o pár sekúnd (pamätáte na oneskorenie, ktoré sme nastavili na serveri?) uvidíme zoznam s produktmi.

Presne tak uvidíme zmeny aj v Redux DevTools. Teraz sa naše produkty objavia aj v stave (pozrite sa na kartu 'State'), ak ste klikli na akciu products/fetchProducts/fulfilled. Tam sa objaví aj nový stav 'success'. Kliknite teraz na akciu products/fetchProducts/pending a pozrite sa, čím sa teraz líši karta 'State'.

Jediný nepríjemný moment, ktorý sa vám môže stať (hovoril som o tom na predchádzajúcej lekcii) - je duplikácia požiadavky údajov. V dôsledku čoho, u nás v zozname nebude 8, ale celých 16 produktov a kritické upozornenia v konzole vývojára. Poďme sa tým zaoberať na ďalšej lekcii.

Otvorte vašu aplikáciu so študentmi. Otvorte v nej súbor studentsSlice.js. V tele funkcie createSlice po vlastnosti reducers pridajte vlastnosť extraReducers. Odovzdajte metóde extraReducers builder.

Pomocou metódy builder.addCase pridajte spracovanie pre akcie pending, fulfilled a rejected, ktoré odosiela fetchStudents pri požiadavke údajov, ako je ukázané v lekcii.

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
Používame cookies na fungovanie stránky, analýzu a personalizáciu. Spracúvanie údajov prebieha v súlade s Politikou ochrany osobných údajov.
prijať všetky nastaviť odmietnuť