⊗jsrxPmWFDA 18 of 57 menu

Afsendelse af action og useDispatch hook i Redux

Vi har implementeret næsten alle komponenter for at få et Redux-program til at fungere. Tilbage står kun at finde ud af at afsende en action fra en React-komponent. Lad os komme i gang.

Åbn vores applikation med produkter. I formen i komponenten NewProductForm har vi en knap til at gemme data for et nyt produkt. Lad os tilføje en klik-håndtering til den. Lad den ved klik udløse handlingen onSaveProductClick:

<button type="button" onClick={onSaveProductClick}> save </button>

Ved oprettelse af et nyt produkt har vi brug for en ny id til det. Vi vil generere den ved hjælp af den velkendte bibliotek nanoid. Forresten, den behøver du ikke installere, da den allerede følger med RTK-pakken. Lad os tilføje nanoid til importen:

import { nanoid } from '@reduxjs/toolkit'

Vi husker også, at den eneste måde at ændre state på - er at kalde metoden dispatch, som findes i store, og videregive et action-objekt. For at få adgang til denne metode vil vi anvende React-Redux hook useDispatch. Lad os importere den:

import { useDispatch } from 'react-redux'

I koden for funktionen NewProductForm opretter vi en konstant dispatch for den lige efter at vi har oprettet konstanter for vores lokale states:

const dispatch = useDispatch()

Vi skal også importere action creator productAdded, som vi fik i sidste lektion:

import { productAdded } from './productsSlice'

Nu kan vi skrive selve funktionen for håndteringen onSaveProductClick. Lad os gøre dette før kommandoen return:

const onSaveProductClick = () => {}

Inde i funktionen kalder vi dispatch, danner action-objektet, hvor i egenskaben payload vil vi have den genererede id, navn, beskrivelse, pris og antal produkt. Alle disse data tager vi fra de lokale states. Samtidig tjekker vi i starten i en betingelse om alle felter er udfyldt - kun i dette tilfælde kalder vi dispatch. I slutningen af funktionens kode returnerer vi de lokale states til deres oprindelige tilstand:

const onSaveProductClick = () => { if (name && desc && price && amount) { dispatch( productAdded({ id: nanoid(), name, desc, price, amount }) ) setName('') setDesc('') setPrice(0) setAmount(0) } }

Lad os nu starte vores applikation, indtaste data i formularfelterne og trykke på knappen for at gemme. Hurra, nederst på siden dukkede der op et nyt produkt. Ved at åbne Redux DevTools, og i den fanen Inspector, ser vi, at til venstre foruden @@INIT er der også vores action products/productAdded. Og i højre del kan vi klikke på fanerne Action og State, imens vi skifter mellem @@INIT og products/productAdded. Nu ser vi, at vores nye produkt bliver tilføjet. Også på fanen Action ser vi actionen, genereret automatisk med createSlice (klik for eksempel på Raw). Hurra: vi behøvede ikke at skrive den manuelt.

Åbn din applikation med studerende, og derefter filen NewStudentForm.jsx, tilføj en klik-håndtering til gemme-knappen.

Skriv alle nødvendige imports og skriv funktionen onSaveStudentClick, ved at anvende metoden dispatch som vist i lektionen.

Start applikationen, indtast data i formularfelterne og tryk på gemme-knappen. Sørg for, at en ny studerende er tilføjet nederst på siden.

Åbn Redux DevTools og gå igennem fanerne Action og State, sørg for, at det nye objekt med den studerende bliver tilføjet. Se på action-objektet, som blev genereret for dig, og send det som svar på denne opgave.

ituzluzckkaz