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 setState dispersos 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.