⊗jsrxPmWFDA 18 of 57 menu

Het verzenden van action en de useDispatch hook in Redux

We hebben bijna alle onderdelen voor het laten werken van een Redux-applicatie geïmplementeerd. Het enige wat nog rest, is het verzenden van een action vanuit een React-component. Laten we beginnen.

Open onze applicatie met producten. In het formulier van de component NewProductForm hebben we een knop om de gegevens van een nieuw product op te slaan. Laten we hier een click-handler aan toevoegen. Laat bij een klik de handler onSaveProductClick worden uitgevoerd:

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

Voor het aanmaken van een nieuw product hebben we een nieuwe id nodig. We genereren deze met behulp van de bekende bibliotheek nanoid. Trouwens, deze hoeft niet geïnstalleerd te worden, omdat deze al bij het RTK-pakket zit. Laten we nanoid toevoegen aan de import:

import { nanoid } from '@reduxjs/toolkit'

We herinneren ons ook dat de enige manier om de state te wijzigen, is door de methode dispatch aan te roepen, die beschikbaar is in de store, en een action-object door te geven. Om bij deze methode te komen, gebruiken we de React-Redux hook useDispatch. Laten we deze ook importeren:

import { useDispatch } from 'react-redux'

In de code van de functie NewProductForm maken we er meteen een constante dispatch voor aan, nadat we constanten voor onze lokale states hebben aangemaakt:

const dispatch = useDispatch()

We moeten ook de action creator productAdded importeren, die we in de vorige les hebben gekregen:

import { productAdded } from './productsSlice'

Nu kunnen we de handler-functie onSaveProductClick schrijven. Laten we dit doen vóór de return opdracht:

const onSaveProductClick = () => {}

Binnen in de functie roepen we dispatch aan, vormen we het action-object, waar in de eigenschap payload de gegenereerde id, naam, beschrijving, prijs en hoeveelheid van het product terechtkomen. Al deze gegevens halen we uit de lokale states. Hierbij controleren we eerst in een conditie of alle velden zijn ingevuld - alleen in dat geval roepen we dispatch aan. Aan het einde van de functiecode zetten we de lokale states terug in hun oorspronkelijke staat:

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

Laten we nu onze applicatie starten, gegevens in de formuliervelden invoeren en op de opslaan-knop klikken. Hoera, onderaan de pagina verscheen een nieuw product. Als we Redux DevTools openen, en daarin het tabblad Inspector, zien we dat links naast @@INIT ook onze action products/productAdded verschenen is. En aan de rechterkant kunnen we klikken op de tabbladen Action en State, terwijl we wisselen tussen @@INIT en products/productAdded. Nu zien we dat ons nieuwe product wordt toegevoegd. Ook zien we op het tabblad Action de action die automatisch gegenereerd is met createSlice (klik bijvoorbeeld op Raw). Hoera: we hoefden hem niet handmatig te schrijven.

Open je applicatie met studenten, en vervolgens het bestand NewStudentForm.jsx, voeg een click-handler toe aan de opslaan-knop.

Schrijf alle benodigde imports en schrijf de handler-functie onSaveStudentClick, pas de methode dispatch toe zoals getoond in de les.

Start de applicatie, voer gegevens in de formuliervelden in en klik op de opslaan-knop. Controleer of onderaan de pagina een nieuwe student is toegevoegd.

Open Redux DevTools en ga door de tabbladen Action en State, controleer of het nieuwe studentobject wordt toegevoegd. Bekijk het action-object dat voor jou is gegenereerd en stuur het in als antwoord op deze taak.

friduzltrhy