⊗jsrxPmWFDA 18 of 57 menu

Enviando actions e o hook useDispatch no Redux

Implementamos praticamente todos os componentes necessários para o funcionamento de uma aplicação Redux. Agora só precisamos entender como enviar uma action a partir de um componente React. Vamos lá.

Abra nossa aplicação de produtos. No formulário do componente NewProductForm temos um botão para salvar os dados do novo produto. Vamos adicionar um manipulador de clique a ele. Quando clicarmos nele, o manipulador onSaveProductClick será acionado:

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

Ao criar um novo produto, precisaremos de um novo id para ele. Vamos gerá-lo usando a conhecida biblioteca nanoid. A propósito, não é necessário instalá-la, pois já vem incluída no pacote RTK. Vamos adicionar o nanoid na importação:

import { nanoid } from '@reduxjs/toolkit'

Também lembramos que a única maneira de alterar o state é chamar o método dispatch, que está disponível na store, e passar um objeto action. Para acessar esse método, usaremos o hook do React-Redux useDispatch. Vamos importá-lo:

import { useDispatch } from 'react-redux'

No código da função NewProductForm, vamos criar uma constante para ele, dispatch, logo após criarmos as constantes para nossos states locais:

const dispatch = useDispatch()

Também precisamos importar o action creator productAdded que obtivemos na lição anterior:

import { productAdded } from './productsSlice'

Agora podemos escrever a própria função manipuladora onSaveProductClick. Vamos fazer isso antes do comando return:

const onSaveProductClick = () => {}

Dentro da função, chamamos dispatch, formamos o objeto action, onde a propriedade payload receberá o id gerado, o nome, a descrição, o preço e a quantidade do produto. Retiramos todos esses dados dos states locais. Ao mesmo tempo, no início, verificamos em uma condição se todos os campos estão preenchidos - somente neste caso chamamos o dispatch. No final do código da função, retornamos os states locais ao estado original:

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

Agora vamos iniciar nossa aplicação, inserir dados nos campos do formulário e clicar no botão de salvar. Uhuul, um novo produto apareceu na parte inferior da página. Abrindo o Redux DevTools, e nele a aba Inspector, vemos que à esquerda, além de @@INIT, também aparece nossa action products/productAdded. E na parte direita podemos clicar nas abas Action e State, alternando entre @@INIT e products/productAdded. Agora vemos que nosso novo produto é adicionado. Também na aba Action vemos a action gerada automaticamente usando createSlice (clique, por exemplo, em Raw). Uhuul: não precisamos digitá-la manualmente.

Abra sua aplicação de estudantes, e então o arquivo NewStudentForm.jsx, adicione ao botão de salvar um manipulador de clique.

Escreva todas as importações necessárias e escreva a função manipuladora onSaveStudentClick, aplicando o método dispatch como mostrado na lição.

Inicie a aplicação, insira dados nos campos do formulário e clique no botão de salvar. Certifique-se de que um novo estudante foi adicionado na parte inferior da página.

Abra o Redux DevTools e navegue pelas abas Action e State, certifique-se de que o novo objeto de estudante é adicionado. Veja o objeto action que foi gerado para você e envie-o na resposta a esta tarefa.

kknldaswsv