⊗jsrxPmATInr 45 of 57 menu

Introdução a thunks no Redux

No capítulo anterior, organizamos o funcionamento do servidor, banco de dados e cliente para troca de dados. Agora precisamos fazer a última ponte, que ajudará nossa aplicação Redux, organizada de forma 'síncrona', a interagir com o cliente assíncrono que criamos na última lição do capítulo anterior, para enviar solicitações e obter os dados necessários na resposta.

Como lembramos das primeiras lições da seção anterior, o Redux não sabe nada sobre como trabalhar com lógica assíncrona e, para isso, usaremos o middleware thunk. Este middleware permite trabalhar com actions enviadas, usar os métodos dispatch e getState da store no código do nosso thunk, e também ajudar o método dispatch a trabalhar não apenas com objetos JS comuns, mas também com entidades como funções e promises.

Geralmente, a função thunk é chamada com dois argumentos, dispatch e getState (se necessário), que podem ser usados no corpo dessa função. Com ela, é possível despachar actions regulares. Também é possível enviá-la via store.dispatch. Um exemplo de tal função é mostrado abaixo:

const changeColorThunk = (dispatch, getState) => { const colorBefore = getState() console.log(`Cor Antiga: ${colorBefore.color}`) dispatch(changeColor()) const colorAfter = getState() console.log(`Cor Nova: ${colorAfter.color}`) } store.dispatch(changeColorThunk)

Agora, vamos abrir nossa aplicação de produtos. A primeira coisa que devemos obter do servidor ao iniciar a aplicação é a lista de produtos. Como geralmente os thunks são escritos nos arquivos de slice, abriremos o arquivo productsSlice.js.

A boa notícia é que não precisamos nos preocupar em instalar o Redux Thunk, pois a função configureStore do RTK já fará isso por nós. Portanto, simplesmente adicionaremos createAsyncThunk na importação no arquivo:

import { createSlice, nanoid, createAsyncThunk } from '@reduxjs/toolkit'

Vamos adicionar também nosso cliente na importação:

import { client } from '../../api/client'

E agora, usando createAsyncThunk, criaremos nosso primeiro thunk para obter os produtos. Faremos isso logo após a declaração do objeto initialState:

export const fetchProducts = createAsyncThunk()

O primeiro parâmetro de createAsyncThunk será uma string para o tipo da action gerada, e o segundo será uma função de callback para payload, que retornará ou os dados ou uma promise com erro (consulte o arquivo client.js). No código da função, chamamos client.get e passamos o caminho que especificamos no servidor (verifique os parâmetros aceitos por http.get em server.js):

export const fetchProducts = createAsyncThunk( 'products/fetchProducts', async () => { const response = await client.get('/fakeServer/products') return response.data } )

Abra sua aplicação de estudantes. Abra nela o arquivo studentsSlice.js. Importe para ele a função createAsyncThunk para criar o thunk, e também o client para enviar requisições de API para o servidor.

Imediatamente após a declaração do objeto initialState, use createAsyncThunk para criar o thunk fetchStudents para obter a lista de estudantes, que enviará uma requisição GET para o endereço /fakeServer/students, especificado em seu arquivo server.js, e retornará response.data, conforme mostrado nos materiais da lição. Como primeiro parâmetro para createAsyncThunk, especifique a string students/fetchStudents para o tipo da action.

bydeenesfrptru