⊗jsrxPmATER 48 of 57 menu

Ytterligare reducers i Redux

Låt oss öppna vår produktapplikation, och i den filen productsSlice.js. Du har förmodligen lagt märke till att vi skapade thunken fetchProducts som en separat funktion? Vi gjorde så eftersom createSlice inte stöder definition av thunks. Hur kan vi i det här fallet få reducern i products-slice:n att svara på actions som definieras utanför products? Trots allt behöver vi bearbeta actions som skickas av thunken fetchProducts.

För sådana fall har createSlice egenskapen extraReducers, som tillåter att lägga till ytterligare reducers, som i sin tur kommer att bearbeta actions som inte definierats i denna slice.

Låt oss nu i funktionen createSlice efter egenskapen reducers med alla reducers lägga till ytterligare en metod extraReducers:

extraReducers() {},

Vi måste skicka ett objekt builder till denna metod, som har metoder för att lägga till ytterligare reducers:

extraReducers(builder) {},

Vi kommer att använda en av metoderna i builder - addCase, som tar en action creator som första parameter och en reducer som andra. En av actions som kommer att skickas av fetchProducts vid förfrågan är fetchProducts.pending, vilket talar om för oss att förfrågan har skickats. Låt oss i detta fall ändra status till 'in progress' (innan dess var den 'idle'):

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

Låt oss nu hantera action som skickas vid en lyckad förfrågan. Här kommer vi att ändra inte bara status i state till 'success', utan också hämta produkterna i slice:n products från action:s payload. För att samla alla produkter behöver vi metoden 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) }) },

Vid en misslyckad förfrågan kommer vi att ändra status till 'fail' och skriva till state felmeddelandet:

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

Om vi startar vår applikation nu och klickar på 'Products' i menyn, så kommer vi efter ett par sekunder (kommer du ihåg fördröjningen som vi satte på servern?) att se en lista med produkter.

På samma sätt kommer vi att se förändringar i Redux DevTools. Nu kommer våra produkter att dyka upp i state (kolla fliken 'State'), om du klickade på action products/fetchProducts/fulfilled. Där kommer också den nya statusen 'success' att dyka upp. Klicka nu på action products/fetchProducts/pending och se skillnaden på fliken 'State'.

Det enda obehagliga som kan hända (jag nämnde detta i föregående lektion) - är duplicering av dataförfrågningar. Som ett resultat kommer vi i listan att få inte 8, utan hela 16 produkter och kritiska varningar i utvecklarkonsolen. Låt oss ta itu med detta i nästa lektion.

Öppna din studentapplikation. Öppna filen studentsSlice.js i den. I funktionen createSlice, efter egenskapen reducers, lägg till egenskapen extraReducers. Skicka builder till metoden extraReducers.

Med hjälp av metoden builder.addCase lägg till hantering för actions pending, fulfilled och rejected, som skickas av fetchStudents vid dataförfrågan, som visas i lektionen.

Svenska
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Vi använder kakor för webbplatsens funktion, analys och personalisering. Behandling av data sker i enlighet med Integritetspolicyn.
acceptera alla anpassa avvisa