Reducerin lisääminen Redux-sovellukseen

Edellisessä oppitunnissa loimme komponentin UserReaction, jotta jokaisella tuotteella olisi myös käyttäjien reaktiot. Nyt meidän on kirjoitettava reducer, joka käsittelee reaktiolaskuria kun käyttäjä napsauttaa mitä tahansa reaktionappia.

Avataanpa tuotesovelluksemme, ja siellä tiedosto productsSlice.js, joka sisältää kaikki reducerit. Nyt luomme reducers-ominaisuuteen vielä yhden reducerin reactionClicked (voimme laittaa sen ensimmäiseksi - ennen productAdded:ia, vaikkei sillä ole väliä). Kuten yleensä, välitämme sille parametreina state ja action:

products/productsSlice.jsreactionClicked(state, action) {},

Ja nyt aaltosulkeiden sisään, jotka jätimme tyhjiksi edellisessä vaiheessa, kirjoitamme sille koodin. Ensinnäkin puremme tuotteen id:n payload-objektista action ja reaktion nimen:

products/productsSlice.jsconst { productId, reaction } = action.payload

Sitten saadusta tilasta haetaan tarvittava tuote:

products/productsSlice.jsconst currentProduct = state.find(product => product.id === productId)

Ja jos tällainen tuote on olemassa, kasvatetaan annetun reaktion arvoa 1:llä:

products/productsSlice.jsif (currentProduct) {
  currentProduct.reactions[reaction]++
}

Siinä kaikki, koodimme reactionClicked:lle on valmis:

products/productsSlice.jsreactionClicked(state, action) {
  const { productId, reaction } = action.payload
  const currentProduct = state.find(product => product.id === productId)
  if (currentProduct) {
    currentProduct.reactions[reaction]++
  }
},

Lisätään tiedoston loppuun saadun action creatorin vienti:

products/productsSlice.jsxexport const {
  reactionClicked,
  productAdded,
  productUpdated
} = productsSlice.actions

Tässä on huomioitava kaksi tärkeää seikkaa. Kuten muistat aiemmista oppitunneista - arvoa on kiellettyä päivittää suoraan näin reducerin koodissa (katso tätä riviä: reactions[reaction]++), mutta meillä se menee läpi, koska teemme sen createSlice:n sisällä, joka käyttää Immer-kirjastoa. Se huolehtii siitä, että koodimme muunnetaan "turvalliseksi" arvon päivitykseksi. Tämä antaa meille mahdollisuuden kirjoittaa monimutkaisia asioita yksinkertaisemmin.

Seuraava asia, joka on muistettava - action-objektin tulee sisältää mahdollisimman vähän tietoa - vain sen verran, että voidaan osoittaa, mitä tapahtui. Siinä ei pidä tehdä mitään laskelmia. Kaikki tilan päivittämiseen tarvittavat laskelmat on tehtävä reducerissa, tähän voidaan kirjoittaa niin paljon logiikkaa kuin tarvitaan.

Задание 1

Avaa opiskelijasovelluksesi ja lisää tiedostoon studentsSlice.js vielä yksi reduceri voteClicked reducers-kenttään, kuten oppitunnissa näytetään. Kirjoita sille koodi. Reducerisi tehtävänä on napsautuksen yhteydessä kasvattaa kyseisen opiskelijan napsautetun vote:n (tai äänen) arvoa 1:llä.

Задание 2

Älä unohda viedä saatua voteClicked action creatoria tiedoston lopussa.