Gestión del estado
Cuándo usar Slices vs RTK Query
Tipo de estado
Herramienta
Ejemplos
Creando un 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: {
// Conmutadores booleanos
sidebarToggled(state) {
state.sidebarOpen = !state.sidebarOpen;
},
// Establecer valor específico
modalOpened(state) {
state.modalOpen = true;
},
modalClosed(state) {
state.modalOpen = false;
},
// Acciones con payload
viewModeChanged(state, action: PayloadAction<'grid' | 'list'>) {
state.viewMode = action.payload;
},
themeChanged(state, action: PayloadAction<'light' | 'dark'>) {
state.theme = action.payload;
},
// Múltiples propiedades
uiReset() {
return initialState;
},
},
});
// Exportar acciones
export const {
sidebarToggled,
modalOpened,
modalClosed,
viewModeChanged,
themeChanged,
uiReset,
} = uiSlice.actions;
// Exportar reducer
export default uiSlice.reducer;
// Exportar selectores
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 del Entity Adapter
Mutaciones de estado
Selectores generados
Ejemplo de Estado Complejo
Selectores Memoizados
Lógica asíncrona con Extra Reducers
Buenas prácticas
1. Mantén el estado mínimo
2. Usa mutaciones compatibles con Immer
3. Organiza los reducers lógicamente
4. Tipar las acciones correctamente
Probando Slices
Siguientes pasos
Última actualización