⊗jsrxPmATER 48 of 57 menu

Reducer Tambahan di Redux

Mari buka aplikasi produk kita, dan di dalamnya file productsSlice.js. Mungkin Anda menyadari bahwa kita membuat thunk fetchProducts sebagai fungsi terpisah? Kita melakukannya seperti itu, karena createSlice tidak mendukung pendefinisian thunks. Lalu bagaimana dalam kasus ini kita membuat reducer slice products merespons aksi-aksi yang didefinisikan di luar products? Bukankah kita justru perlu menangani aksi-aksi yang dikirim oleh thunk fetchProducts.

Untuk kasus seperti ini, createSlice memiliki properti extraReducers, yang memungkinkan penambahan reducer tambahan, yang pada gilirannya akan menangani aksi-aksi yang didefinisikan bukan di dalam slice ini.

Sekarang mari dalam tubuh fungsi createSlice setelah properti reducers dengan semua reducer tambahkan satu metode lagi extraReducers:

extraReducers() {},

Kita harus meneruskan objek builder ke metode ini, yang memiliki metode-metode, dengan bantuan yang dapat menambahkan reducer tambahan:

extraReducers(builder) {},

Kita akan menggunakan salah satu metode builder - addCase, yang menerima parameter pertama sebagai action creator, dan parameter kedua sebagai reducer. Salah satu aksi yang akan dikirimkan oleh fetchProducts saat permintaan adalah fetchProducts.pending, yang memberi tahu kita bahwa permintaan telah dikirim. Mari dalam hal ini kita ubah status menjadi 'in progress' (sebelumnya 'idle'):

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

Sekarang mari tangani aksi yang akan dikirim dalam kasus permintaan berhasil. Di sini kita akan mengubah tidak hanya status di state menjadi 'success', tetapi juga mengambil produk ke dalam slice products dari payload aksi. Untuk mengumpulkan semua produk kita akan membutuhkan metode 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) }) },

Dalam kasus permintaan gagal kita akan mengubah status menjadi 'fail' dan mencatat di state pesan kesalahan:

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

Jika kita sekarang menjalankan aplikasi kita dan di menu klik 'Products', maka setelah beberapa detik (ingat tentang penundaan, yang kita atur di server?) kita akan melihat daftar produk.

Secara sama kita akan melihat perubahan di Redux DevTools. Sekarang produk kita akan muncul juga di state (lihat tab 'State'), jika Anda mengklik aksi products/fetchProducts/fulfilled. Di sana juga akan muncul status baru 'success'. Sekarang klik pada aksi products/fetchProducts/pending dan lihatlah, apa yang sekarang membedakan tab 'State'.

Satu-satunya momen tidak menyenangkan yang mungkin terjadi pada Anda (saya membicarakan ini pada pelajaran sebelumnya) - adalah duplikasi permintaan data. Akibatnya, di daftar kita bukan 8, tetapi sejumlah 16 produk dan peringatan kritis di konsol pengembang. Mari kita bahas ini pada pelajaran berikutnya.

Buka aplikasi Anda dengan siswa. Buka file studentsSlice.js di dalamnya. Di tubuh fungsi createSlice setelah properti reducers tambahkan properti extraReducers. Teruskan builder ke metode extraReducers.

Dengan metode builder.addCase tambahkan penanganan untuk aksi pending, fulfilled dan rejected, yang dikirim oleh fetchStudents saat permintaan data, seperti yang ditunjukkan dalam pelajaran.

Indonesia
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Kami menggunakan cookie untuk operasi situs, analitik, dan personalisasi. Pemrosesan data dilakukan sesuai dengan Kebijakan Privasi.
terima semua atur tolak