Dodajanje reduktorja v Redux aplikacijo

V prejšnji lekciji smo ustvarili komponento UserReaction, da bi imel vsak izdelek tudi uporabniške reakcije. Zdaj moramo napisati reduktor, ki bo obdeloval števec reakcij ob kliku uporabnika na gumb določene reakcije.

Odprimo našo aplikacijo z izdelki, in v njej datoteko productsSlice.js z vsemi reduktorji. Zdaj v lastnosti reducers ustvarimo še en reduktor reactionClicked (lahko ga postavimo na prvo mesto - pred productAdded, čeprav to ni pomembno). Kot običajno, mu podajmo kot parametra state in action:

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

In zdaj znotraj zavitih oklepajev, ki smo jih pustili prazne na prejšnjem koraku, napišimo zanj kodo. Najprej bomo izvlekli id izdelka iz payload objekta action in ime reakcije:

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

Nato iz podanega stanja (state) dobimo želeni izdelek:

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

In če tak izdelek obstaja, povečamo vrednost podane reakcije za 1:

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

To je vse, naša koda za reactionClicked je pripravljena:

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

Na koncu datoteke dodajmo izvoz nastalega ustvarjalca akcije (action creator):

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

Tukaj je potrebno opozoriti na dve pomembni točki. Kot se spomnite iz prejšnjih lekcij - posodabljati vrednost neposredno tako v kodi reduktorja ni dovoljeno (poglejte to vrstico: reactions[reaction]++), vendar nam bo to uspelo, ker to delamo znotraj createSlice, ki uporablja knjižnico Immer. Ta bo poskrbela, da bo našo kodo preoblikovala v "varno" posodobitev vrednosti. To nam omogoča, da zapletene stvari pišemo na enostavnejši način.

Naslednja stvar, ki si jo je treba zapomniti - objekt action mora vsebovati čim manjšo količino informacij - samo toliko, da označi, kaj se je zgodilo. V njem ne smemo opravljati nobenih izračunov. Vse izračune za posodobitev stanja (state) je treba opraviti v reduktorju, tukaj lahko za to napišemo toliko logike, kolikor je potrebno.

Задание 1

Odprite vašo aplikacijo s študenti in v datoteki studentsSlice.js dodajte še en reduktor voteClicked v polje reducers, kot je prikazano v lekciji. Napišite kodo zanj. Naloga vašega reduktorja je - ob kliku povečati vrednost vote (ali glasu), na katerega so kliknili, za danega študenta, za 1.

Задание 2

Na koncu datoteke ne pozabite izvoziti nastalega ustvarjalca akcije (action creator) voteClicked.