⊗jsrxPmWFDA 18 of 57 menu

Invio di action e hook useDispatch in Redux

Abbiamo implementato quasi tutti i componenti per il funzionamento di un'applicazione Redux. Resta solo da capire come inviare un'action da un componente React. Iniziamo.

Apri la nostra applicazione dei prodotti. Nel modulo del componente NewProductForm abbiamo un pulsante per salvare i dati del nuovo prodotto. Aggiungiamoci un gestore di click. Al click su di esso, deve essere attivato il gestore onSaveProductClick:

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

Per creare un nuovo prodotto, avremo bisogno di un nuovo id. Lo genereremo tramite la ben nota libreria nanoid. A proposito, non è necessario installarla, poiché è già inclusa nel pacchetto RTK. Aggiungiamo nanoid all'import:

import { nanoid } from '@reduxjs/toolkit'

Ricordiamo inoltre che l'unico modo per modificare lo state - è chiamare il metodo dispatch, che è presente nello store, e passare un oggetto action. Per accedere a questo metodo, useremo l'hook di React-Redux useDispatch. Importiamolo anche lui:

import { useDispatch } from 'react-redux'

Nel codice della funzione NewProductForm creiamo una costante dispatch subito dopo aver creato le costanti per i nostri state locali:

const dispatch = useDispatch()

Dobbiamo anche importare l'action creator productAdded, che abbiamo ottenuto nella lezione precedente:

import { productAdded } from './productsSlice'

Ora possiamo scrivere la funzione del gestore onSaveProductClick. Facciamolo prima del comando return:

const onSaveProductClick = () => {}

All'interno della funzione chiamiamo dispatch, formiamo l'oggetto action, nella proprietà payload inseriremo l'id generato, il nome, la descrizione, il prezzo e la quantità del prodotto. Prendiamo tutti questi dati dagli state locali. Controlliamo all'inizio con una condizione se tutti i campi sono compilati - solo in questo caso chiamiamo dispatch. Alla fine del codice della funzione riportiamo gli state locali allo stato iniziale:

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

Ora avviamo la nostra applicazione, inseriamo i dati nei campi del modulo e premiamo il pulsante di salvataggio. Evviva, in fondo alla pagina è apparso un nuovo prodotto. Aprendo Redux DevTools, e in esso la scheda Inspector, vediamo che a sinistra oltre a @@INIT è apparsa anche la nostra action products/productAdded. E nella parte destra possiamo cliccare sulle schede Action e State, alternando tra @@INIT e products/productAdded. Ora vediamo che il nostro nuovo prodotto viene aggiunto. Inoltre, nella scheda Action vediamo l'action, generato automaticamente con createSlice (clicca, ad esempio, su Raw). Evviva: non abbiamo dovuto scriverlo manualmente.

Apri la tua applicazione degli studenti, e poi il file NewStudentForm.jsx, aggiungi al pulsante di salvataggio un gestore di click.

Scrivi tutte le import necessarie e scrivi la funzione gestore onSaveStudentClick, applicando il metodo dispatch come mostrato nella lezione.

Avvia l'applicazione, inserisci nei campi del modulo i dati e clicca sul pulsante di salvataggio. Assicurati che in fondo alla pagina sia stato aggiunto un nuovo studente.

Apri Redux DevTools ed esplora le schede Action e State, assicurati che il nuovo oggetto studente venga aggiunto. Guarda l'oggetto action che è stato generato, invialo nella risposta a questo compito.

csdauzciden