Redux dominó una década de React y hoy vive como legacy en la mayoría de los proyectos nuevos. Zustand, Jotai y signals reducen el costo de re-render a niveles que la context API nunca alcanzó. Los benchmarks de render y el tipo de aplicación deciden entre los tres modelos.
Redux: dónde todavía compensa
Los equipos grandes valoran devtools maduros con time-travel, el ecosistema de middleware y los patrones que impone el framework. createSlice y RTK Query encogieron el boilerplate y cubren mutations y cache sin ceremonia extra. La disciplina sigue obligatoria: una subscription con selector mal escrito provoca tormenta de re-renders. La documentación de React sobre useSyncExternalStore explica cómo los selectores inestables convierten la store en un cuello de botella de render.
Zustand: store único sin providers
Un store, hooks como selectores, cero providers y ningún dispatch. Cada componente se suscribe al pedazo de estado que usa, y las funciones de igualdad (shallow de zustand/shallow) controlan el re-render al nivel del campo. El paquete pesa poco más de 1 kB minificado, y el middleware persist sincroniza con localStorage en dos líneas. La documentación oficial describe el patrón de selección por campo.
Jotai: derivaciones en cadena
Jotai arma el estado de abajo hacia arriba: los átomos derivados calculan valores a partir de otros átomos, y los átomos async se suspenden con React Suspense nativo. Ese modelo resuelve estados dependientes complejos, como wizards de formulario multi-etapa y filtros combinatorios en tiempo real. Cuando la derivación domina el dominio, Jotai ahorra código y bugs. La documentación de Jotai lista los patrones de composición de átomos.
Signals: reactividad fuera del ciclo de render
Los signals tocan el nodo exacto del DOM y se saltan el re-render del componente. Solid.js prueba el modelo en producción, Preact expone signals en la API pública, y la propuesta TC39 de signals avanza la estandarización dentro de React. La interop con React todavía tiene fricción: evalúa signals por proyecto, donde la stack lo permita.
Benchmark: 10 mil filas
Una tabla de 10 mil filas actualizando una celda: el estado en Context re-renderiza todo, Zustand con selectores re-renderiza la fila, signals actualizan la celda. Las diferencias llegan a órdenes de magnitud en el tiempo de commit. Cuanto más grande la lista y más frecuente la escritura, mayor el abismo entre los modelos.
Criterio de elección
- ¿Domina el estado de servidor? TanStack Query carga con el peso y el estado cliente se reduce a concerns de UI
- ¿Caso general? Zustand como default pragmático
- ¿Dominan derivaciones en cadena? Jotai
- ¿La performance de render es contractual (dashboards en tiempo real, editores)? Signals donde la stack lo permita
Migración incremental
La coexistencia funciona: convierte providers de Context en stores Zustand poco a poco, un dominio por PR. Mantén Redux donde los flujos de devtools son parte del trabajo del equipo. Adopta signals por isla en páginas híbridas, empezando por los componentes de mayor frecuencia de actualización.
¿Te gustó el contenido?
Construyo productos web y soluciones con IA de la manera correcta — arquitectura sólida, código sostenible y entrega real.
Hablemos