Gestión del estado
Esta página cubre la creación de slices de Redux para la gestión del estado de UI y local usando createSlice y createEntityAdapter.
Cuándo usar Slices vs RTK Query
Elige la herramienta adecuada para tu estado:
Datos remotos (propiedad del servidor)
RTK Query
Perfiles de usuario, NFTs, elementos de catálogo, órdenes
Estado de UI (propiedad del cliente)
createSlice
Filtros, modales, preferencias de vista, estado de formularios
Colecciones normalizadas
createEntityAdapter
Listas ordenadas/filtradas, actualizaciones optimistas
No dupliques los mismos datos en un slice y en RTK Query a la vez. Elige una única fuente de verdad.
Creando un Slice Básico
Usa createSlice para estado simple 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: {
// 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
Para colecciones normalizadas (listas con IDs), usa createEntityAdapter:
Métodos del Entity Adapter
Mutaciones de estado
Selectores generados
Ejemplo de Estado Complejo
Combinando múltiples preocupaciones en un solo slice:
Selectores Memoizados
Usa createSelector de Reselect para estado computado/derivado:
Lógica asíncrona con Extra Reducers
Maneja respuestas de RTK Query o thunks asíncronos en tu slice:
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
Revisar Patrones de Componentes para usar slices en componentes
Aprende sobre Integración Web3 para el estado de blockchain
Ver Pruebas y Rendimiento para consejos de optimización
Última actualización