⊗jsrxPmRDPAD 26 of 57 menu

Падрыхтоўка даных для аб'екта action у Redux

Нядаўна мы гаварылі з вамі пра тое, што функцыя createSlice чакае адзін аргумент пры стварэнні action.payload. З аднаго боку гэта спрашчае яе выкарыстанне, з другога ж можа патрабаваць дадатковых дзеянняў для падрыхтоўкі змесціва аб'екта action.

Давайце адчынём наша прыкладанне з прадуктамі, а ў ім файл NewProductForm.jsx. Звярніце ўвагу на наступны радок кода:

dispatch(productAdded({ id: nanoid(), name, desc, price, amount }))

Тут мы збіраем payload аб'ект прама ў React кампаненце і перадаём яго ў экшэн productAdded. А што калі нам прыдзецца адпраўляць такі ж экшэн з некалькіх кампанентаў або логіка для зборкі акажацца складанай? Па ідэі нашаму кампаненту павінна быць усё роўна як выглядае аб'ект у payload для дадзенага action. Да таго ж нас не задавальняе сталае дубляванне кода.

Гэтыя праблемы нам зноў можа дапамагчы вырашыць наш знакаміты createSlice, прыколькі пры напісанні рэдьюсера ён дазваляе нам выкарыстоўваць callback-функцыю prepare, у якой можна пісаць розную логіку, генераваць выпадковыя лікі і іншае. У такім выпадку значэнне для поля рэдьюсера можа быць прадстаўлена ў выглядзе наступнага аб'екта:

{reducer, prepare}

Давайце адчынём наш файл productsSlice.js і зменім код для рэдьюсера productAdded. Цяпер гэты кавалачак кода:

productAdded(state, action) { state.push(action.payload) },

Мы зменім на наступны, у якім функцыя reducer будзе займацца абнаўленнем стэйта ў store, а prepare - вяртаць аб'ект payload з згенераваным id і іншымі нашымі данымі:

productAdded: { reducer(state, action) { state.push(action.payload) }, prepare(name, desc, price, amount) { return { payload: { id: nanoid(), name, desc, price, amount, }, } }, },

Прыколькі цяпер мы будзем генераваць id тут, а не ў кампаненце, давайце дадамо nanoid у імпарт:

import { createSlice, nanoid } from '@reduxjs/toolkit'

Напослед унясем змены ў NewProductForm.jsx. Замест радка:

dispatch(productAdded({ id: nanoid(), name, desc, price, amount }))

У нас будзе такая, у якой мы проста праз коску перададзім неабходныя нам даныя (не забудзьце ў гэтым файле прыбраць nanoid з імпарту):

dispatch(productAdded(name, desc, price, amount))

Запусцім прыкладанне, затым створым новы прадукт і пераканаемся, што мы нічога не паламалі.

Адчынiце ваша прыкладанне са студэнтамі. У файле StudentsSlice.js перапішыце ваш рэдьюсер studentAdded такім чынам, каб ён быў у выглядзе аб'екта {reducer, prepare}, як паказана ў уроку.

Унясіце адпаведныя змены ў файл NewStudentForm.jsx, як паказана ў уроку. Запусціце прыкладанне і пераканайцеся, што ўсё працуе як і раней.

Беларуская
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 для працы сайта, аналітыкі і персаналізацыі. Апрацоўка дадзеных адбываецца згодна Палітыкай канфідэнцыяльнасці.
прыняць усе наладзіць адхіліць