Introducción a la Gestión de Estado
Qué es la gestión de estado y por qué es importante en aplicaciones React
¿Qué es la Gestión de Estado?
La gestión de estado es la práctica de administrar los datos que controlan cómo se comporta tu aplicación y qué muestra. En React, "estado" se refiere a cualquier dato que puede cambiar con el tiempo y afecta lo que se renderiza en la pantalla.
A medida que las aplicaciones crecen, gestionar el estado se vuelve cada vez más complejo. Los datos necesitan ser compartidos entre componentes, sincronizados con servidores y mantenidos consistentes en toda la interfaz. Aquí es donde entran las soluciones de gestión de estado.
Tipos de Estado
- Estado Local — Datos específicos del componente (inputs de formulario, toggles)
- Estado Global — Datos compartidos entre muchos componentes (autenticación de usuario, tema)
- Estado del Servidor — Datos de APIs externas (datos obtenidos, caché)
- Estado de URL — Datos en la URL (parámetros de búsqueda, rutas)
- Estado de Formulario — Datos de formulario, validación, estado de envío
Estado Local con useState
import { useState } from 'react';
function Contador() {
// Estado local - solo este componente lo necesita
const [cuenta, setCuenta] = useState(0);
return (
<div>
<p>Cuenta: {cuenta}</p>
<button onClick={() => setCuenta(cuenta + 1)}>
Incrementar
</button>
</div>
);
}
function Formulario() {
const [nombre, setNombre] = useState('');
const [email, setEmail] = useState('');
return (
<form>
<input
value={nombre}
onChange={(e) => setNombre(e.target.value)}
placeholder="Nombre"
/>
<input
value={email}
onChange={(e) => setEmail(e.target.value)}
placeholder="Email"
/>
</form>
);
}
Estado Complejo con useReducer
import { useReducer } from 'react';
// La función reducer maneja las transiciones de estado
function todoReducer(estado, accion) {
switch (accion.type) {
case 'AGREGAR_TODO':
return [...estado, { id: Date.now(), texto: accion.texto, hecho: false }];
case 'ALTERNAR_TODO':
return estado.map(todo =>
todo.id === accion.id ? { ...todo, hecho: !todo.hecho } : todo
);
case 'ELIMINAR_TODO':
return estado.filter(todo => todo.id !== accion.id);
default:
return estado;
}
}
function ListaTodos() {
const [todos, dispatch] = useReducer(todoReducer, []);
const agregarTodo = (texto) => {
dispatch({ type: 'AGREGAR_TODO', texto });
};
const alternarTodo = (id) => {
dispatch({ type: 'ALTERNAR_TODO', id });
};
return (
<div>
<button onClick={() => agregarTodo('Nueva tarea')}>Agregar Todo</button>
{todos.map(todo => (
<div key={todo.id} onClick={() => alternarTodo(todo.id)}>
{todo.hecho ? '✓' : '○'} {todo.texto}
</div>
))}
</div>
);
}
El Problema: Prop Drilling
// Sin gestión de estado, los datos deben pasarse por cada nivel
function App() {
const [usuario, setUsuario] = useState(null);
const [tema, setTema] = useState('light');
return (
<Layout usuario={usuario} tema={tema}>
<Header usuario={usuario} tema={tema} />
<Main usuario={usuario} tema={tema}>
<Sidebar usuario={usuario} tema={tema} />
<Content usuario={usuario} tema={tema}>
<PerfilUsuario usuario={usuario} /> {/* ¡Finalmente usa usuario! */}
</Content>
</Main>
</Layout>
);
}
// Esto se llama "prop drilling" - pasar props a través
// de muchas capas de componentes que no los usan
¿Cuándo Necesitas Gestión de Estado?
| Escenario | Solución |
|---|---|
| Inputs de formulario simples | useState |
| Estado complejo del componente | useReducer |
| Compartir estado entre hermanos | Elevar el estado |
| Tema, auth, idioma | Context API |
| App grande, actualizaciones frecuentes | Redux, Zustand, Jotai |
| Datos del servidor con caché | TanStack Query, SWR |
Panorama de Gestión de Estado
🏠 React Integrado
- • useState - estado local del componente
- • useReducer - lógica de estado compleja
- • Context API - compartir estado globalmente
📦 Bibliotecas Externas
- • Redux / Redux Toolkit - estado predecible
- • Zustand - mínimo y rápido
- • Jotai - estado atómico
- • MobX - estado reactivo
🌐 Estado del Servidor
- • TanStack Query (React Query)
- • SWR por Vercel
- • RTK Query (Redux Toolkit)
📝 Estado de Formulario
- • React Hook Form
- • Formik
- • Zod para validación
💡 Principios Clave
- • Empieza simple - useState es suficiente a menudo
- • Mantén el estado cerca de donde se usa
- • Eleva el estado solo cuando sea necesario
- • Separa el estado del cliente del estado del servidor