⊗jsrxPmWFDA 18 of 57 menu

Envoi d'action et hook useDispatch dans Redux

Nous avons mis en place presque tous les éléments pour le fonctionnement d'une application Redux. Il ne reste plus qu'à comprendre comment envoyer une action depuis un composant React. Commençons.

Ouvrez notre application avec les produits. Dans le formulaire du composant NewProductForm, nous avons un bouton pour sauvegarder les données du nouveau produit. Ajoutons-lui un gestionnaire de clic. Lorsqu'on clique dessus, le gestionnaire onSaveProductClick doit s'exécuter :

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

Pour créer un nouveau produit, nous aurons besoin d'un nouvel id. Nous allons le générer à l'aide de la bibliothèque bien connue nanoid. D'ailleurs, il n'est pas nécessaire de l'installer, car elle est déjà incluse avec le package RTK. Ajoutons nanoid dans l'import :

import { nanoid } from '@reduxjs/toolkit'

Nous nous souvenons également que la seule façon de modifier le state - est d'appeler la méthode dispatch, qui est disponible sur le store et de lui passer un objet action. Pour accéder à cette méthode, nous utiliserons le hook React-Redux useDispatch. Importons-le :

import { useDispatch } from 'react-redux'

Dans le code de la fonction NewProductForm, créons une constante dispatch pour lui immédiatement après avoir créé les constantes pour nos states locaux :

const dispatch = useDispatch()

Nous devons également importer le creator d'action productAdded, que nous avons obtenu dans la leçon précédente :

import { productAdded } from './productsSlice'

Maintenant nous pouvons écrire la fonction du gestionnaire onSaveProductClick. Faisons-le avant la commande return :

const onSaveProductClick = () => {}

À l'intérieur de la fonction, nous appelons dispatch, formons l'objet action, dans la propriété payload duquel nous mettrons l'id généré, le nom, la description, le prix et la quantité du produit. Nous prenons toutes ces données depuis les states locaux. En même temps, au début, nous vérifions dans une condition si tous les champs sont remplis - seulement dans ce cas nous appelons dispatch. À la fin du code de la fonction, nous remettons les states locaux dans leur état initial :

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

Maintenant lançons notre application, saisissons les données dans les champs du formulaire et cliquons sur le bouton de sauvegarde. Hourra, un nouveau produit est apparu en bas de la page. En ouvrant Redux DevTools, et dans celui-ci l'onglet Inspector, nous voyons qu'à gauche en plus de @@INIT, notre action products/productAdded est apparue. Et dans la partie droite nous pouvons cliquer sur les onglets Action et State, en basculant entre @@INIT et products/productAdded. Maintenant nous voyons que notre nouveau produit est ajouté. Également, dans l'onglet Action nous voyons l'action, générée automatiquement avec createSlice (cliquez, par exemple, sur Raw). Hourra : nous n'avons pas eu à l'écrire manuellement.

Ouvrez votre application avec les étudiants, puis le fichier NewStudentForm.jsx, attachez au bouton de sauvegarde un gestionnaire de clic.

Écrivez tous les imports nécessaires et écrivez la fonction gestionnaire onSaveStudentClick, en utilisant la méthode dispatch comme montré dans la leçon.

Lancez l'application, entrez des données dans les champs du formulaire et cliquez sur le bouton de sauvegarde. Assurez-vous qu'un nouvel étudiant a été ajouté en bas de la page.

Ouvrez Redux DevTools et parcourez les onglets Action et State, assurez-vous que le nouvel objet étudiant est ajouté. Regardez l'objet action qui a été généré pour vous, envoyez-le en réponse à cette tâche.

enuzlruples