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.