⊗jsrxPmATER 48 of 57 menu

Redux-də Əlavə Reduktorlar

Gəlin məhsullarla bağlı tətbiqimizi açaq, onun içindəki productsSlice.js faylını açaq. Yəqin ki, siz fetchProducts thunk-ni ayrıca funksiya kimi yaratdığımızı fərq etmisiniz? Biz bunu belə etdik, çünki createSlice thunk-ların təyin edilməsini dəstəkləmir. Bəs bu halda products diliminin reduktorunu products-dən kənarda təyin edilən aksiyalara cavab verməyə necə məcbur edə bilərik? Axı biz məhz fetchProducts thunk-unun göndərdiyi aksiyaları emal etməliyik.

Bu kimi hallar üçün createSlice-in extraReducers xassəsi var, bu da əlavə reduktorlar əlavə etməyə imkan verir, onlar da öz növbəsində bu dilimdə deyil, kənarda təyin edilən aksiyaları emal edəcəklər.

Gəlin indi createSlice funksiyasının gövdəsində reducers xassəsindən sonra, bütün reduktorlarla birlikdə bir daha extraReducers metodu əlavə edək:

extraReducers() {},

Biz bu metoda builder obyektini ötürməliyik, onun da əlavə reduktorlar əlavə etmək üçün istifadə edilə bilən metodları var:

extraReducers(builder) {},

Biz builder-in metodlarından birini istifadə edəcəyik - addCase, birinci parametr kimi aksiya yaradıcısını, ikinci parametr kimi isə reduktoru qəbul edir. fetchProducts tərəfindən sorğu zamanı göndərilən aksiyalardan biri fetchProducts.pending-dir, bu da bizə sorğunun göndərildiyini bildirir. Gəlin bu halda statusu 'in progress' olaraq dəyişək (bundan əvvəl 'idle' idi):

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

İndi uğurlu sorğu halında göndəriləcək aksiyanı emal edək. Burada biz təkcə vəziyyətdəki statusu 'success' olaraq dəyişməyəcəyik, həm də products diliminə məhsulları aksiyanın payload hissəsindən götürəcəyik. Bütün məhsulları toplamaq üçün bizə concat metodu lazım olacaq:

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) }) },

Uğursuz sorğu halında biz statusu 'fail' olaraq dəyişəcəyik və vəziyyətə xəta mesajını yazacağıq:

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

Əgər biz indi tətbiqimizi işə salsaq və menyuda 'Products'-a klik etsək, onda bir neçə saniyədən sonra (serverdə təyin etdiyimiz gecikməni xatırlayırsınız?) məhsul siyahısını görəcəyik.

Eynilə biz dəyişiklikləri Redux DevTools-da da görəcəyik. İndi məhsullarımız veytdə də görünəcək ('State' vərəqinə baxın), əgər siz products/fetchProducts/fulfilled aksiyasına klik etsəniz. Orada yeni status 'success' də görünəcək. İndi products/fetchProducts/pending aksiyasına klik edin və 'State' vərəqinin indi nə ilə fərqləndiyinə baxın.

Baş verə biləcək yeganə xoşagəlməz an (mən bu barədə əvvəlki dərsdə danışmışdım) - bu məlumat sorğusunun təkrarlanmasıdır. Nəticədə, siyahımızda 8 deyil, tam 16 məhsul və developer konsolunda kritik xəbərdarlıqlar alacağıq. Gəlin bununla növbəti dərsdə məşğul olaq.

Tələbələrlə bağlı tətbiqinizi açın. Ondakı studentsSlice.js faylını açın. createSlice funksiyasının gövdəsində reducers xassəsindən sonra extraReducers xassəsini əlavə edin. extraReducers metoduna builder ötürün.

builder.addCase metodu ilə pending, fulfilledrejected aksiyalarının emal edilməsini əlavə edin, onlar fetchStudents tərəfindən məlumat sorğusu zamanı göndərilir, dərsdə göstərildiyi kimi.

Azərbaycan
AfrikaansБългарскиবাংলাБеларускаяČ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
Biz saytin işi, analitika və fərdiləşdirmə üçün cookie istifadə edirik. Məlumatların emalı Məxfilik Siyasəti əsasında həyata keçirilir.
hamısını qəbul et konfiqurasiya et rədd et