Gerenciamento de Estado
Quando usar Slices vs RTK Query
Tipo de Estado
Ferramenta
Exemplos
Criando um Slice Básico
// 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
Métodos do Entity Adapter
Mutações de Estado
Seletores Gerados
Exemplo de Estado Complexo
Seletores Memoizados
Lógica Assíncrona com Extra Reducers
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