Gerenciamento de Estado

Esta página cobre a criação de slices do Redux para gerenciamento de estado de UI e local usando o createSlice e createEntityAdapter.

Quando usar Slices vs RTK Query

Escolha a ferramenta certa para seu estado:

Tipo de Estado
Ferramenta
Exemplos

Dados remotos (de propriedade do servidor)

RTK Query

Perfis de usuários, NFTs, itens de catálogo, pedidos

Estado de UI (de propriedade do cliente)

createSlice

Filtros, modais, preferências de exibição, estado de formulários

Coleções normalizadas

createEntityAdapter

Listas ordenadas/filtradas, atualizações otimistas

circle-exclamation

Criando um Slice Básico

Use createSlice para estado simples de UI:

// src/features/ui/ui.slice.ts
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import type { RootState } from '@/app/store';

interface UIState {
  sidebarOpen: boolean;
  modalOpen: boolean;
  viewMode: 'grid' | 'list';
  theme: 'light' | 'dark';
}

const initialState: UIState = {
  sidebarOpen: true,
  modalOpen: false,
  viewMode: 'grid',
  theme: 'light',
};

const uiSlice = createSlice({
  name: 'ui',
  initialState,
  reducers: {
    // Alternadores booleanos
    sidebarToggled(state) {
      state.sidebarOpen = !state.sidebarOpen;
    },
    
    // Definir valor específico
    modalOpened(state) {
      state.modalOpen = true;
    },
    
    modalClosed(state) {
      state.modalOpen = false;
    },
    
    // Ações com payload
    viewModeChanged(state, action: PayloadAction<'grid' | 'list'>) {
      state.viewMode = action.payload;
    },
    
    themeChanged(state, action: PayloadAction<'light' | 'dark'>) {
      state.theme = action.payload;
    },
    
    // Várias propriedades
    uiReset() {
      return initialState;
    },
  },
});

// Exportar ações
export const {
  sidebarToggled,
  modalOpened,
  modalClosed,
  viewModeChanged,
  themeChanged,
  uiReset,
} = uiSlice.actions;

// Exportar reducer
export default uiSlice.reducer;

// Exportar seletores
export const selectSidebarOpen = (state: RootState) => state.ui.sidebarOpen;
export const selectModalOpen = (state: RootState) => state.ui.modalOpen;
export const selectViewMode = (state: RootState) => state.ui.viewMode;
export const selectTheme = (state: RootState) => state.ui.theme;

Usando Entity Adapters

Para coleções normalizadas (listas com IDs), use createEntityAdapter:

Métodos do Entity Adapter

Mutações de Estado

Seletores Gerados

Exemplo de Estado Complexo

Combinando múltiplas preocupações em um único slice:

Seletores Memoizados

Use createSelector do Reselect para estado computado/derivado:

Lógica Assíncrona com Extra Reducers

Trate respostas do RTK Query ou thunks assíncronos no seu slice:

Boas Práticas

1. Mantenha o Estado Mínimo

2. Use Mutações Compatíveis com Immer

3. Organize Reducers Logicamente

4. Tipar Ações Apropriadamente

Testando Slices

Próximos Passos

Atualizado