⊗jsrxPmATER 48 of 57 menu

Иловагии редюсерҳо дар Redux

Биёед барномаи мо бо маҳсулотро кушоем, ва дар он файли productsSlice.js-ро. Шояд шумо дидед, ки мо thunk-и fetchProducts чун функсияи ҷудогона сохтем? Мо инро чунин кардем, зеро ки createSlice муайян кардани thunks-ро дастгирӣ намекунад. Пас, чӣ гуна дар ин ҳолат редюсери слайси products-ро вазн кунем, то ба экшенҳое, ки берун аз products муайян шудаанд, посух диҳад? Зеро ба мо дақиқан барои коркарди экшенҳо ниёз аст, ки thunk-и fetchProducts мефиристад.

Барои чунин ҳолатҳо дар createSlice хосияти extraReducers мавҷуд аст, ки имкон медиҳад редюсерҳои иловагӣ илова кунед, ки ба навбати худ экшенҳоеро, ки дар ин слайс муайян нашудаанд, кор карда метавонанд.

Ҳоло дар бадани функсияи createSlice пас аз хосияти reducers бо ҳамаи редюсерҳо як усули дигари extraReducers илова кунем:

extraReducers() {},

Ба ин усул мо бояд объекти builder-ро бирасонем, ки усулҳое дорад, бо ёрӣ аз онҳо метавон редюсерҳои иловагиро илова кард:

extraReducers(builder) {},

Мо яке аз усулҳои builder-ро истифода мебарем - addCase, ки параметри якум action creator-ро қабул мекунад, ва параметри дуюм reducer-ро мегирад. Яке аз экшенҳое, ки fetchProducts дар дархост мефиристад ин fetchProducts.pending мебошад, ки ба мо мегӯяд, ки дархост фиристода шуд. Биёед дар ин ҳолат статусро ба 'in progress' иваз кунем (то ин дафъа он 'idle' буд):

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

Ҳоло экшене, ки дар сурати дархости муваффақ фиристода мешавад, кор кунем. Дар ин ҷо мо на танҳо статусро дар стейт ба 'success' иваз мекунем, балки маҳсулотро низ аз payload экшен ба слайси products мегирем. Барои ҷамъ кардани ҳамаи маҳсулот ба мо усули 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) }) },

Дар сурати дархости номуваффақ мо статусро ба 'fail' иваз мекунем ва дар стейт паёми хаторо сабт мекунем:

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

Агар мо ҳоло барномаамонро оғоз кунем ва дар меню ба 'Products' клик кунем, пас пас аз чанд сония (дар хотир доред, ки таъхирро, ки мо дар сервер таъин кардем?) мо рӯйхати маҳсулотро хоҳем дид.

Ҳамин тавр мо тағиротро дар Redux DevTools хоҳем дид. Ҳоло маҳсулоти мо дар стейт низ пайдо мешаванд (варақаи 'State'-ро бубинед), агар шумо ба экшени products/fetchProducts/fulfilled клик кардед. Дар он ҷо статуси нави 'success' низ пайдо мешавад. Ҳоло ба экшени products/fetchProducts/pending клик кунед ва бубинед, ки варақаи 'State' чӣ гуна фарқ мекунад.

Ягона лаҳзаи нороҳат, ки шумо метавонед бо он рӯ ба рӯ шавед (ман дар бораи ин дар дарси гузашта сухан гуфтам) - ин такрори дархости додаҳо мебошад. Дар натиҷа, дар рӯйхати мо на 8, балки тамоми 16 маҳсулот ва огоҳиҳои критикӣ дар консоли барномасоз пайдо мешаванд. Биёед дар дарси оянда бо ин кор кунем.

Барномаи худро бо донишҷӯён кушоед. Дар он файли studentsSlice.js-ро кушоед. Дар бадани функсияи createSlice пас аз хосияти reducers хосияти extraReducers-ро илова кунед. Ба усули extraReducers builder-ро бирасонед.

Бо ёрии усули builder.addCase коркарди экшенҳои pending, fulfilled ва rejected-ро илова кунед, ки fetchStudents ҳангоми дархости додаҳо мефиристад, тавре ки дар дарс нишон дода шуд.

Тоҷикӣ
AfrikaansAzə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
Мо барои коркарди сомона, таҳлил ва шахсӣ кардан аз cookie истифода мебарем. Коркарди маълумот мувофиқи Сиёсати махфият сурат мегирад.
ҳамаро қабул кардан танзим кардан рад кардан