Redux Toolkit (RTK)
O Redux Toolkit é a abordagem recomendada para escrever lógica Redux. Ele simplifica a configuração da store, a criação de reducers e a gestão de estados imutáveis.
Por que usar RTK?
- Menos boilerplate: Reduz drasticamente a quantidade de código necessária para configurar o Redux.
- Imutabilidade simplificada: Usa a biblioteca
Immerinternamente, permitindo escrever lógica que "parece" mutável (ex:state.value = 1), mas que é tratada de forma imutável. - Configuração de Store: O
configureStorejá vem com middlewares úteis (como oredux-thunkou integração com DevTools) por padrão.
Conceitos Principais
1. Slices
Um "Slice" é uma coleção de lógica de reducer e ações para uma única funcionalidade do seu aplicativo.
javascript
import { createSlice } from '@reduxjs/toolkit';
const userSlice = createSlice({
name: 'user',
initialState: {
profile: null,
isAuthenticated: false,
},
reducers: {
setUser: (state, action) => {
// Graças ao Immer, podemos "mutar" o estado diretamente
state.profile = action.payload;
state.isAuthenticated = true;
},
logout: (state) => {
state.profile = null;
state.isAuthenticated = false;
},
},
});
export const { setUser, logout } = userSlice.actions;
export default userSlice.reducer;2. configureStore
Centraliza todos os reducers da aplicação.
javascript
import { configureStore } from '@reduxjs/toolkit';
import userReducer from './features/user/userSlice';
export const store = configureStore({
reducer: {
user: userReducer,
},
});Quando usar?
- Estado Global Complexo: Quando dados precisam ser acessados por muitos componentes em níveis diferentes da árvore.
- Sincronização de Dados: Quando múltiplas partes da UI precisam reagir à mesma mudança de estado.
- Cache de Infraestrutura: Para armazenar tokens, preferências de usuário ou estados que persistem durante a sessão (em conjunto com a Camada de Aplicação).
Quando NÃO usar?
- Dados Locais de Tela: Se o dado é usado apenas em uma tela, use
useStateou o hook da tela. - Server State: Para dados que vêm da API, prefira o TanStack Query, pois ele gerencia cache e sincronização de forma mais eficiente que o Redux puro.
- Simplicidade: Não adicione Redux se o problema pode ser resolvido com Props ou Context API de forma simples.
Redux Saga
No nosso projeto:
- Redux Saga: Usado para gerenciar efeitos colaterais (side-effects) complexos e assíncronos que precisam ser orquestrados globalmente.
Melhores Práticas
- Não coloque tudo no Redux: Avalie se o estado é realmente global.
- Use Seletores: Utilize seletores para extrair dados da store, facilitando a manutenção se a estrutura do estado mudar.
- Evite dados duplicados: Mantenha o estado o mais normalizado possível.