⊗jsrxPmWFDA 18 of 57 menu

Envío de action y hook useDispatch en Redux

Hemos implementado casi todos los componentes para el funcionamiento de una aplicación Redux. Solo queda entender el envío de action desde un componente React. Comencemos.

Abra nuestra aplicación de productos. En el formulario del componente NewProductForm tenemos un botón para guardar los datos del nuevo producto. Añadámosle un controlador de clic. Que al hacer clic en él se active el controlador onSaveProductClick:

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

Al crear un nuevo producto, necesitaremos un nuevo id para él. Lo generaremos utilizando la conocida biblioteca nanoid. Por cierto, no es necesario instalarla, ya que viene incluida en el paquete RTK. Añadamos nanoid en la importación:

import { nanoid } from '@reduxjs/toolkit'

También recordamos que la única forma de cambiar el state es llamar al método dispatch, que tiene el store, y pasarle el objeto action. Para acceder a este método, aplicaremos el hook de React-Redux useDispatch. Importémoslo también:

import { useDispatch } from 'react-redux'

En el código de la función NewProductForm creemos una constante dispatch justo después de haber creado las constantes para nuestros estados locales:

const dispatch = useDispatch()

También necesitamos importar el action creator productAdded, que obtuvimos en la lección anterior:

import { productAdded } from './productsSlice'

Ahora podemos escribir la función controladora onSaveProductClick. Hagámoslo antes del comando return:

const onSaveProductClick = () => {}

Dentro de la función llamamos a dispatch, formamos el objeto action, en la propiedad payload irán el id generado, el nombre, la descripción, el precio y la cantidad del producto. Tomamos todos estos datos de los estados locales. Al mismo tiempo, al principio verificamos en una condición si todos los campos están completos - solo en este caso llamamos a dispatch. Al final del código de la función devolvemos los estados locales a su estado original:

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

Ahora ejecutemos nuestra aplicación, ingresemos datos en los campos del formulario y presionemos el botón de guardar. ¡Hurra! Apareció un nuevo producto en la parte inferior de la página. Al abrir Redux DevTools, y en él la pestaña Inspector, vemos que a la izquierda además de @@INIT apareció nuestro action products/productAdded. Y en la parte derecha podemos hacer clic en las pestañas Action y State, alternando entre @@INIT y products/productAdded. Ahora vemos que nuestro nuevo producto se agrega. También en la pestaña Action vemos el action, generado automáticamente con createSlice (haga clic, por ejemplo, en Raw). Hurra: no tuvimos que escribirlo manualmente.

Abra su aplicación de estudiantes, y luego el archivo NewStudentForm.jsx, asigne al botón de guardar un controlador de clic.

Escriba todas las importaciones necesarias y escriba la función controladora onSaveStudentClick, aplicando el método dispatch como se muestra en la lección.

Ejecute la aplicación, ingrese datos en los campos del formulario y haga clic en el botón de guardar. Asegúrese de que se haya agregado un nuevo estudiante en la parte inferior de la página.

Abra Redux DevTools y revise las pestañas Action y State, asegúrese de que se agregue el nuevo objeto del estudiante. Observe el objeto action que se generó, envíelo en la respuesta a esta tarea.

cstrbnbyuzc