Introducción a Zustand
Hasta ahora hemos visto cómo crear estado global utilizando Context API. Es una solución válida y nativa de React, pero cuando una aplicación empieza a crecer, aparecen algunos problemas clásicos: demasiados providers, renders innecesarios y una estructura difícil de escalar.
En esta clase vamos a conocer Zustand, una de las librerías más populares y minimalistas para la gestión de estado global en React.
Verás por qué es tan utilizada, qué ventajas tiene frente a Context y cómo empezar a usarla con muy poco código.
¿Qué es Zustand?
Zustand es una librería de gestión de estado global:
- Minimalista y muy ligera (≈ 1 KB)
- Con una API muy sencilla
- Sin necesidad de providers
- Con renders optimizados por defecto
- Compatible con React y también usable fuera de React
- Con soporte completo para TypeScript
Su nombre viene del alemán y significa literalmente estado.
¿Por qué usar Zustand en lugar de Context?
Context API tiene ventajas claras:
- Viene incluida en React
- No requiere instalar dependencias
- Es perfecta para estado que cambia poco
Pero también tiene limitaciones:
- Necesita providers
- Puede provocar rerenders innecesarios
- Se vuelve compleja en aplicaciones grandes
Zustand soluciona muchos de estos problemas:
- Menos código y menos boilerplate
- No hay providers
- Los componentes solo se rerenderizan cuando el estado que usan cambia
- Es fácil de organizar y escalar
El único “pero” es que requiere instalar una dependencia externa.
Instalación de Zustand
Instalar Zustand es tan simple como ejecutar:
npm install zustand
Con esto ya tenemos todo lo necesario para empezar a crear nuestro estado global.
Creando nuestra primera store
En lugar de usar Context, vamos a crear una store global.
Una buena práctica es crear una carpeta store donde vivirá todo el estado global de la aplicación.
Ejemplo de una store de autenticación:
import { create } from 'zustand'
type AuthState = {
isLoggedIn: boolean
login: () => void
logout: () => void
}
export const useAuthStore = create<AuthState>((set) => ({
isLoggedIn: false,
login: () => set({ isLoggedIn: true }),
logout: () => set({ isLoggedIn: false }),
}))
Aquí estamos:
- Creando la store con
create - Definiendo el estado inicial
- Definiendo acciones para modificar ese estado
- Exportando directamente un custom hook
Usando la store en los componentes
Una de las grandes ventajas de Zustand es que no necesitamos providers.
Simplemente importamos el hook donde lo necesitemos:
import { useAuthStore } from '../store/auth'
export function Header() {
const { isLoggedIn, login, logout } = useAuthStore()
return (
<>
{isLoggedIn ? (
<button onClick={logout}>Cerrar sesión</button>
) : (
<button onClick={login}>Iniciar sesión</button>
)}
</>
)
}
No hay contexto, no hay provider, no hay configuración extra.
Renders mucho más eficientes
Otra gran diferencia frente a Context es cómo se gestionan los renders.
Con Zustand:
- Solo se rerenderizan los componentes que usan la parte del estado que cambia
- Los cambios son mucho más granulares
- Evitamos rerenderizar toda la aplicación
Esto mejora notablemente el rendimiento en aplicaciones reales.
Cuándo usar Zustand
Zustand es una gran opción cuando:
- Necesitas estado global que cambia con frecuencia
- Tu app empieza a crecer y Context se vuelve incómodo
- Quieres una API simple y directa
- Buscas buen rendimiento sin complicarte
Context sigue siendo útil para casos simples, pero para estado global más complejo, Zustand suele ser una mejor elección.
Resumen
En esta clase has aprendido:
- Qué es Zustand y por qué es tan popular
- Sus ventajas frente a Context API
- Cómo crear una store global
- Cómo usarla sin providers
- Por qué ofrece mejores renders
En la siguiente clase seguiremos profundizando en patrones de estado global y buenas prácticas para aplicaciones React más grandes.