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:

Tipo de estado
Herramienta
Ejemplos

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

circle-exclamation

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

Última actualización