Hooks
Imagina que un componente necesita recordar si un menú desplegable está abierto, o necesita ejecutar código después de renderizarse para sincronizarse con un servidor. Ambas son tareas para un hook. Ya usaste dos: useState le da memoria a un componente, y useEffect ejecuta código después de un render para comunicarte con el mundo exterior de React. Esos dos los usarás más, y el resto de los built-ins siguen la misma estructura: llamas una función dentro de tu componente, y te conecta con parte de la maquinaria de React. El nombre de esa función siempre empieza con use, y ese prefijo es toda la definición de un hook.
Un recorrido por los built-ins más comunes
No necesitas cada hook el primer día, pero es útil saber qué hay disponible para reconocer la herramienta correcta cuando un problema lo requiere. Aquí están los que más aparecen:
useRefguarda un valor mutable que sobrevive a los renders sin causar uno. También es la forma de obtener una referencia directa a un elemento del DOM cuando lo necesitas, como para enfocar un input.useContextlee datos compartidos de un provider circundante, así un componente profundamente anidado puede acceder a un valor sin que lo pases por cada nivel intermedio.useReducermaneja el estado a través de una función reductora, donde cada actualización describe una transición del estado actual al siguiente. Es útil cuando los cambios de estado se vuelven lo suficientemente complejos para que un solouseStateempiece a quedarse corto.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 tienen más espacio en Memoización, una vez que hay una historia real de rendimiento que contar. Refs y el DOM profundiza en useRef, y Context lleva useContext de este resumen hasta providers y estado compartido. Para useReducer, este capítulo es el tratamiento más profundo que recibe, así que vuelve aquí cuando necesites refrescar. Por ahora, el punto es el patrón: un hook es tu forma de acceder 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 bucle, o una función anidada. Cada hook que use un componente debe ejecutarse en cada render, en el mismo orden, siempre.
function Profile({ isLoggedIn }) {
// Mal: este hook solo se ejecuta a veces
if (isLoggedIn) {
const [name, setName] = useState('')
}
// Bien: llámalo en el nivel superior, sin condiciones
const [name, setName] = useState('')
// ...luego usa isLoggedIn dentro de tu lógica
}Segundo, solo llama hooks desde componentes de función de React o desde otros hooks personalizados. Las funciones JavaScript normales no pueden usar hooks, porque no hay un render de componente al que React pueda adjuntar el estado.
Escribir tus propios hooks
Digamos que varios componentes necesitan saber el ancho de la ventana del navegador. En lugar de copiar el mismo código 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 cuando la ventana cambia de tamaño. useWindowWidth es un hook personalizado: una función que llama otros hooks. Ese es todo el patrón, y porque es una función, puedes darle un nombre a una pieza de lógica stateful, ponerla en un solo lugar, y reutilizarla entre componentes. El prefijo use es lo que lo marca como hook, tanto para las herramientas de React como para la próxima persona que lea tu código. Los hooks personalizados agrupan los hooks que ya tienes en algo reutilizable; no añaden nuevas capacidades a React.
use, y conecta tu componente a una característica de React como memoria o efectos. Ya conociste useState y useEffect, y los otros siguen la misma estructura. Lo principal que recordar: llama hooks en el tope de tu componente, nunca dentro de un if o un bucle, así se ejecutan igual en 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 interfaz.

