Los hooks de React son funciones cuyo nombre empieza con use que permiten a un componente de función usar características de React: useState para recordar un valor, useEffect para ejecutar código después de renderizar, useRef para guardar un nodo del DOM, useContext para leer datos compartidos. Los llamas al principio de tu componente, y React conserva sus valores entre renderizados.
Aquí trabajan juntos cuatro hooks. useState guarda el texto, useRef apunta al input para que el botón pueda darle foco, useMemo conserva la lista filtrada hasta que cambia la búsqueda, y useEffect registra después de cada renderizado en el que cambió la búsqueda. Escribe an y mira la consola: una línea por pulsación, después de que se actualiza la lista.
Por qué existen los hooks
Antes de React 16.8, un componente que necesitaba estado o código de ciclo de vida tenía que ser una clase. La lógica de una funcionalidad quedaba repartida entre componentDidMount, componentDidUpdate y componentWillUnmount, y compartirla entre componentes significaba mixins (que nunca funcionaron con la sintaxis de clases), componentes de orden superior o render props, y todos envolvían tu árbol en capas extra.
// The class way: one feature, three methods
class Clock extends React.Component {
state = { now: new Date() };
componentDidMount() {
this.id = setInterval(() => this.setState({ now: new Date() }), 1000);
}
componentWillUnmount() {
clearInterval(this.id);
}
render() {
return <p>{this.state.now.toLocaleTimeString()}</p>;
}
}
Con hooks la misma funcionalidad vive en un solo lugar: el efecto inicia el temporizador y su limpieza lo detiene.
Oculta el reloj y la consola imprime timer stopped: React ejecutó la limpieza cuando Clock salió de la pantalla. Vuelve a mostrarlo y empieza un temporizador nuevo. Los componentes de clase siguen funcionando en React 19, pero el código nuevo usa hooks.
Todos los hooks integrados
React 19.2 agrupa sus hooks según lo que le dan a un componente. Usarás los dos primeros grupos a diario y el resto cuando un problema concreto lo pida.
| Hook | Lo que te da | Página |
|---|---|---|
useState | Un valor que sobrevive a los renderizados y un setter que vuelve a renderizar | useState |
useReducer | Estado actualizado por una función reducer y acciones despachadas | useReducer |
useContext | Un valor que da un padre, sin pasar props | useContext |
useRef | Una caja mutable que sobrevive a los renderizados, a menudo un nodo del DOM | useRef |
useImperativeHandle | Elige lo que ve un padre a través de tu ref | forwardRef |
useEffect | Código que suele ejecutarse después del pintado: temporizadores, suscripciones, peticiones | useEffect |
useLayoutEffect | Código que se ejecuta cuando el DOM se actualiza pero antes del pintado | useLayoutEffect |
useInsertionEffect | Se ejecuta antes de los layout effects, para librerías CSS-in-JS | |
useEffectEvent | Una función que un efecto puede llamar y que siempre ve las props y el estado más recientes | useEffect |
useMemo | Guarda en caché un valor calculado entre renderizados | useMemo |
useCallback | Guarda en caché una función entre renderizados | useCallback |
useTransition | Marca una actualización como no urgente y te avisa mientras está pendiente | useTransition |
useDeferredValue | Una copia de un valor que se queda atrás durante los renderizados pesados | useDeferredValue |
useId | Un id único que coincide en el servidor y en el cliente | useId |
useSyncExternalStore | Se suscribe a un store que vive fuera de React | useSyncExternalStore |
useDebugValue | Una etiqueta para un hook personalizado en React DevTools | |
use | Lee una promesa o un contexto, y puede ir dentro de una condición | use |
useActionState | Estado que actualiza una acción de formulario, con un indicador de pendiente | useActionState |
useOptimistic | Muestra el resultado esperado antes de que responda el servidor | useOptimistic |
useFormStatus | El estado pendiente del formulario padre (de react-dom) |
use, useActionState, useOptimistic y useFormStatus llegaron con React 19, y useEffectEvent pasó a ser estable en 19.2. Todos los demás hooks de la lista funcionan también en React 18.
El estado renderiza, las refs no
No todos los hooks provocan un renderizado. useState y useReducer sí: cambia su valor y React vuelve a dibujar el componente. useRef te da un objeto cuyo campo current puedes cambiar libremente, y React nunca vuelve a renderizar por eso. Eso lo convierte en el lugar adecuado para el id de un temporizador, un valor anterior o un conteo que la pantalla no muestra.
useReducer guarda el carrito y useState guarda la nota; ambos provocan un renderizado cuando cambian, y el efecto registra una línea por renderizado. El efecto también cambia commits.current, pero ese cambio nunca provoca un renderizado propio, así que el registro no entra en bucle. El conteo se actualiza en un efecto y no en el cuerpo del componente porque el cuerpo no debe cambiar nada mientras renderiza.
Las reglas de los hooks
Todos los hooks siguen dos reglas:
- Llama a los hooks en el nivel superior de tu componente, nunca dentro de una condición, un bucle o una función anidada.
- Llama a los hooks solo desde componentes de función o desde tus propios hooks personalizados.
React no conoce los hooks por su nombre. Los conoce por el orden en que los llamas, y espera que ese orden sea el mismo en cada renderizado. Un hook dentro de un if desplazaría a todos los hooks que vienen después. La página de las reglas de los hooks muestra qué se rompe y cómo arreglarlo. use es la única excepción: se puede llamar dentro de una condición.
Tu primer hook personalizado
Cuando dos componentes necesitan la misma lógica con estado, muévela a una función cuyo nombre empiece con use. Esa función puede llamar a cualquier otro hook. Cada componente que la llama recibe su propio estado.
Ambos contadores ejecutan el mismo hook, pero hacer clic en uno no afecta al otro: un hook personalizado comparte lógica, no estado. Agrega una función decrement a useCounter y un botón que la llame, y ambos contadores la reciben a la vez. Hay más patrones (useToggle, useDebounce, useLocalStorage) en la página de hooks personalizados.
Qué hook usar
- La pantalla debe cambiar cuando cambia un valor:
useState, ouseReducercuando muchos eventos actualizan el mismo estado. - Necesitas comunicarte con algo fuera de React (un temporizador, una suscripción, una petición):
useEffect. - Necesitas un nodo del DOM o un valor que la pantalla no muestra:
useRef. - Muchos componentes en lo profundo del árbol necesitan el mismo valor:
useContext. - Un renderizado es lento por un cálculo concreto o porque un hijo memoizado se vuelve a renderizar:
useMemoyuseCallback. El React Compiler puede agregar esta memoización por ti, pero escribirla a mano sigue funcionando y sigue siendo habitual. - Escribir se siente lento porque la actualización que hay detrás es pesada:
useTransitionouseDeferredValue.
Preguntas frecuentes
¿Qué son los hooks en React?
Los hooks son funciones cuyo nombre empieza con use que permiten a un componente de función usar características de React: useState para el estado, useEffect para efectos secundarios, useContext para el contexto, useRef para valores que sobreviven a los renderizados sin provocar uno, y más.
¿Por qué se agregaron los hooks a React?
Antes de los hooks (React 16.8), el estado y los métodos de ciclo de vida solo existían en los componentes de clase, y compartir lógica con estado requería mixins, componentes de orden superior o render props. Los hooks ponen esa lógica en funciones normales que puedes llamar desde cualquier componente de función y compartir como hooks personalizados.
¿Cuántos hooks tiene React?
React 19.2 incluye unos veinte hooks integrados en el paquete react, además de useFormStatus en react-dom. La mayoría de las apps usan unos pocos a diario: useState, useEffect, useRef, useContext, useMemo y useCallback.
¿Puedo usar hooks en componentes de clase?
No. Los hooks solo funcionan dentro de componentes de función y de otros hooks. Igual puedes renderizar un componente de clase junto a componentes de función, y una clase puede renderizar un componente de función que use hooks.
¿Qué es un hook personalizado?
Una función propia cuyo nombre empieza con use y que llama a otros hooks. Permite que varios componentes reutilicen la misma lógica con estado, mientras cada componente que lo llama sigue teniendo su propio estado separado.