useReducer: estado complejo sin caos
Aprende cuándo useReducer mejora la claridad frente a múltiples useState y cómo modelar transiciones de estado.
useReducer no es “más pro” que useState. Es útil cuando el estado tiene varias transiciones relacionadas y empieza a volverse difícil de seguir.
Cuándo suele encajar
- formularios complejos
- filtros con varias acciones
- flujos de carga, éxito y error
- lógica donde varias acciones modifican el mismo bloque de estado
Ejemplo básico
import { useReducer } from 'react';
function reducer(state, action) {
switch (action.type) {
case 'increment':
return { ...state, count: state.count + 1 };
case 'decrement':
return { ...state, count: state.count - 1 };
case 'reset':
return { ...state, count: 0 };
default:
return state;
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, { count: 0 });
return (
<>
<p>{state.count}</p>
<button onClick={() => dispatch({ type: 'increment' })}>+</button>
</>
);
}
Qué aporta de verdad
- centraliza la lógica de actualización
- hace explícitas las acciones posibles
- reduce
setStatedispersos por todo el componente
Buen criterio
Si tienes tres useState simples e independientes, no fuerces useReducer.
Si cada handler empieza a tocar varios estados a la vez y ya cuesta razonar qué cambia, entonces sí.
Patrón habitual con Context
Context comparte el dato. useReducer organiza cómo cambia.
Eso funciona bien para carritos, auth o preferencias globales sin saltar todavía a otra librería.
En la siguiente lección pasamos a useRef, una de las APIs más malinterpretadas por principiantes.