⊗jsrxPmRDPAD 26 of 57 menu

Action-objektin datan valmistelu Reduxissa

Puhuimme hiljattain siitä, että funktio createSlice odottaa yhtä argumenttia luodessa action.payload:ia. Toisaalta tämä yksinkertaistaa sen käyttöä, toisaalta se voi vaatia lisätoimia action-objektin sisällön valmistelussa.

Avataan sovelluksemme tuotteiden kanssa, ja siellä tiedosto NewProductForm.jsx. Kiinnittäkää huomiota seuraavaan koodiriviin:

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

Tässä kokoamme payload-objektin suoraan React-komponentissa ja välitämme sen actioniin productAdded. Mutta entä jos meidän täytyy lähettää samanlainen action useista komponenteista tai datan kokoamisen logiikka osoittautuu monimutkaiseksi? Ideana komponenttimme ei pitäisi välitä siitä, miltä payload-objekti tässä actionissa näyttää. Lisäksi emme ole tyytyväisiä koodin jatkuvaan toistoon.

Nämä ongelmat voi taas auttaa meitä ratkaisemaan kuuluisa createSlice, koska reducerin kirjoittamisessa se sallii meille käyttää callback-funktiota prepare, johon voi kirjoittaa erilaista logiikkaa, generoida satunnaislukuja ja muuta. Tällöin reducerin kentän arvo voi olla esitetty seuraavanlaisena objektina:

{reducer, prepare}

Avataan tiedostomme productsSlice.js ja muutetaan koodi reducerille productAdded. Nyt tämä koodinpala:

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

Vaihdamme seuraavaan, jossa funktio reducer hoitaa staten päivittämisen storeen, ja prepare - palauttaa payload-objektin generoidulla id:llä ja muilla datallamme:

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

Koska nyt aiomme generoida id:n täällä, emmekä komponentissa, lisätään nanoid importtiin:

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

Lopuksi teemme muutokset tiedostoon NewProductForm.jsx. Rivin sijasta:

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

Meillä on tällainen, jossa yksinkertaisesti pilkulla erotellen välitämme tarvitsemamme datan (älä unohda poistaa tästä tiedostosta nanoid importista):

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

Käynnistetään sovellus, luodaan sitten uusi tuote ja varmistetaan, ettemme ole rikkoneet mitään.

Avaa opiskelijasovelluksesi. Tiedostossa StudentsSlice.js kirjoita uudelleen reducerisi studentAdded siten, että se on muodossa {reducer, prepare}, kuten oppitunnissa näytetään.

Tee vastaavat muutokset tiedostoon NewStudentForm.jsx, kuten oppitunnissa näytetään. Käynnistä sovellus ja varmista, että kaikki toimii kuten ennenkin.

Suomi
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Käytämme evästeitä verkkosivuston toiminnalle, analytiikalle ja personoinnille. Tietojen käsittely tapahtuu Tietosuojakäytännön mukaisesti.
hyväksy kaikki mukauta hylkää