⊗jsrxPmATER 48 of 57 menu

Dodatečné reducery v Reduxu

Otevřeme naši aplikaci s produkty, a v ní soubor productsSlice.js. Pravděpodobně jste si všimli, že jsme thunk fetchProducts vytvářeli jako samostatnou funkci? Udělali jsme to proto, že createSlice nepodporuje definici thunks. Jak v tomto případě donutíme reducer slice products reagovat na akce, které jsou definovány mimo products? Vždyť právě potřebujeme zpracovat akce, které posílá thunk fetchProducts.

Pro takové případy má createSlice vlastnost extraReducers, která umožňuje přidávat dodatečné reducery, které naopak budou zpracovávat akce, definované ne v tomto slicu.

Nyní v těle funkce createSlice po vlastnosti reducers se všemi reducery přidejme ještě jednu metodu extraReducers:

extraReducers() {},

Této metodě musíme předat objekt builder, který má metody, pomocí kterých lze přidat dodatečné reducery:

extraReducers(builder) {},

Budeme používat jednu z metod builder - addCase, která jako první parametr přijímá action creator, a jako druhý reducer. Jedna z akcí, kterou nám bude posílat fetchProducts při požadavku je fetchProducts.pending, což nám říká, že požadavek byl odeslán. V tomto případě změňme status na 'in progress' (předtím byl 'idle'):

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

Nyní zpracujme akci, která se odešle v případě úspěšného požadavku. Zde budeme měnit nejen status ve stavu na 'success', ale také vezmeme produkty v slice products z payload akce. K tomu, abychom shromáždili všechny produkty, budeme potřebovat metodu 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 případě neúspěšného požadavku změníme status na 'fail' a zapíšeme do stavu zprávu o chybě:

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

Pokud nyní spustíme naši aplikaci a v menu klikneme na 'Products', tak za pár sekund (pamatujete na zpoždění, které jsme nastavili na serveru?) uvidíme seznam s produkty.

Stejně tak uvidíme změny i v Redux DevTools. Nyní se naše produkty objeví i ve stavu (podívejte se na záložku 'State'), pokud jste klikli na akci products/fetchProducts/fulfilled. Zároveň se tam objeví i nový status 'success'. Nyní klikněte na akci products/fetchProducts/pending a podívejte se, čím se nyní liší záložka 'State'.

Jediný nepříjemný moment, který vás může potkat (mluvil jsem o tom v předchozí lekci) - je duplikování požadavku na data. V důsledku čehož, u nás v seznamu nebude 8, ale celých 16 produktů a kritická varování v konzoli vývojáře. Pojďme se tím zabývat v příští lekci.

Otevřete vaši aplikaci se studenty. Otevřete v ní soubor studentsSlice.js. V těle funkce createSlice po vlastnosti reducers přidejte vlastnost extraReducers. Předejte metodě extraReducers builder.

Pomocí metody builder.addCase přidejte zpracování pro akce pending, fulfilled a rejected, které odesílá fetchStudents při požadavku dat, jak je ukázáno v lekci.

Čeština
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяDanskDeutschΕλληνικά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
Používáme soubory cookie pro fungování webu, analýzu a personalizaci. Zpracování údajů probíhá v souladu s Zásadami ochrany osobních údajů.
přijmout vše přizpůsobit odmítnout