Hooks
Imagina que un componente necesita recordar si un dropdown está abierto, o necesita ejecutar código después de renderizarse para sincronizarse con un servidor. Ambas tareas son trabajo de un hook. Ya has usado dos: useState le da memoria a un componente, y useEffect ejecuta código después de un render para salir de React. Estos dos son los que usarás más, y el resto de los integrados siguen la misma estructura: llamas una función dentro de tu componente, y se conecta a una parte de la maquinaria de React. El nombre de esa función siempre empieza con use, y ese prefijo es la definición completa de un hook.
Un recorrido por los integrados más comunes
No necesitas cada hook el primer día, pero ayuda saber qué hay disponible para reconocer la herramienta correcta cuando un problema la pide. Aquí están los que aparecen más:
useRefsostiene un valor mutable que sobrevive los renders sin causarlos. También es cómo obtienes una referencia directa a un elemento del DOM cuando la necesitas, como para enfocar un input.useContextlee datos compartidos de un provider alrededor, así un componente profundamente anidado puede alcanzar un valor sin que lo pases hacia abajo a través de cada nivel.useReducermaneja el estado a través de una función reducer, donde cada actualización describe una transición del estado actual al siguiente. Es bueno cuando los cambios de estado se vuelven lo suficientemente complejos como para que un únicouseStateempiece a fallar.useMemocachea un valor calculado entre renders y solo lo recalcula cuando sus dependencias cambian.useCallbackhace lo mismo para una función, dándote la misma instancia de función entre renders en lugar de una nueva cada vez.
useMemo y useCallback obtienen más atención después, cuando hay una historia real de rendimiento que contar. Refs y el DOM cubre useRef completamente. Para useContext y useReducer, este capítulo es el tratamiento más profundo que reciben, así que vuelve aquí cuando necesites un repaso. Por ahora, lo importante es el patrón: un hook es tu puerta a una característica específica de React, y su nombre te dice que es un hook.
Las reglas de los hooks
Los hooks vienen con dos reglas, y React cuenta con que las sigas.
Primero, llama hooks en el nivel superior de tu componente. No los llames dentro de una condición, un loop, o una función anidada. Cada hook que usa un componente debe ejecutarse en cada render, en el mismo orden, siempre.
function Profile({ isLoggedIn }) {
// Incorrecto: este hook solo se ejecuta a veces
if (isLoggedIn) {
const [name, setName] = useState('')
}
// Correcto: llámalo en el nivel superior, incondicionalmente
const [name, setName] = useState('')
// ...luego usa isLoggedIn dentro de tu lógica
}Segundo, solo llama hooks desde componentes React de función o desde otros hooks personalizados. Las funciones JavaScript normales no pueden usar hooks, porque no hay un render del componente para que React adjunte el estado.
Escribiendo tus propios hooks
Digamos que varios componentes necesitan conocer el ancho de la ventana del navegador. En lugar de copiar el mismo cableado de useState y useEffect en cada uno, puedes empaquetar esa lógica una sola vez:
import { useState, useEffect } from 'react'
function useWindowWidth() {
const [width, setWidth] = useState(window.innerWidth)
useEffect(() => {
const handleResize = () => setWidth(window.innerWidth)
window.addEventListener('resize', handleResize)
return () => window.removeEventListener('resize', handleResize)
}, [])
return width
}Ahora cualquier componente puede llamar const width = useWindowWidth() y obtener un valor que se actualiza conforme la ventana cambia de tamaño. useWindowWidth es un hook personalizado: una función que llama otros hooks. Ese es el patrón completo, y como es una función, puedes darle un nombre a un pedazo de lógica con estado, ponerlo en un lugar, y reutilizarlo entre componentes. El prefijo use es lo que lo marca como un hook, tanto para la herramienta de React como para la próxima persona que lee tu código. Los hooks personalizados empaquetan los hooks que ya tienes en algo reutilizable; no agregan nuevos poderes a React.
use, y conecta tu componente a una característica de React como memoria o efectos. Ya conoces useState y useEffect, y los otros siguen la misma forma. Lo principal que recordar: llama hooks en la cima de tu componente, nunca dentro de un if o un loop, para que se ejecuten de la misma manera cada render. Próximo: Pensando en React, donde componentes, props, estado, y efectos se juntan en un proceso para convertir un diseño en una UI.

