Hooks
Digamos que um componente precisa lembrar se um dropdown está aberto, ou precisa rodar algum código depois de renderizar para sincronizar com um servidor. Ambos são trabalhos para um hook. Você já usou dois deles: useState dá memória a um componente, e useEffect roda código depois de uma renderização para alcançar fora do React. Esses são os dois que você vai usar mais, e o resto dos built-ins seguem o mesmo padrão: você chama uma função dentro do seu componente, e ela te conecta a uma parte da máquina do React. O nome dessa função sempre começa com use, e esse prefixo é a definição completa de um hook.
Um tour pelos built-ins mais comuns
Você não precisa de todo hook no primeiro dia, mas é útil saber o que está disponível para reconhecer a ferramenta certa quando um problema exigir. Aqui estão os que aparecem mais frequentemente:
useRefmantém um valor mutável que sobrevive às renderizações sem causar uma. É também como você consegue uma referência direta a um elemento do DOM quando precisa, como focar um input.useContextlê dados compartilhados de um provider ao redor, para que um componente profundamente aninhado consiga alcançar um valor sem você passar por todos os níveis do meio.useReducergerencia o estado através de uma função reducer, onde cada atualização descreve uma transição do estado atual para o próximo. É um bom ajuste quando mudanças de estado ficam complexas o suficiente para que um simplesuseStatecomece a apertar.useMemocacheia um valor computado entre renderizações e só o recalcula quando suas entradas mudam.useCallbackfaz o mesmo para uma função, devolvendo a mesma instância de função entre renderizações em vez de uma nova a cada vez.
useMemo e useCallback ganham mais espaço em Memoization, uma vez que há uma história de desempenho real para contar. Refs e o DOM pega useRef na íntegra, e Context leva useContext deste resumo através de providers e estado compartilhado. Para useReducer, este capítulo é o tratamento mais profundo que ele recebe, então volte aqui quando precisar de um refresco. Por enquanto, o ponto é o padrão: um hook é sua forma de entrar em um recurso específico do React, e seu nome te diz que é um hook.
As regras dos hooks
Hooks vêm com duas regras, e o React conta com você seguindo-as.
Primeiro, chame hooks no nível superior do seu componente. Não os chame dentro de uma condição, um loop, ou uma função aninhada. Cada hook que um componente usa deve rodar em toda renderização, na mesma ordem, toda vez.
function Profile({ isLoggedIn }) {
// Errado: este hook só roda às vezes
if (isLoggedIn) {
const [name, setName] = useState('')
}
// Correto: chame no nível superior, incondicionalmente
const [name, setName] = useState('')
// ...então use isLoggedIn dentro de sua lógica
}Segundo, só chame hooks a partir de componentes de função React ou de outros hooks customizados. Funções JavaScript regulares não podem usar hooks, porque não há uma renderização de componente para React anexar o estado.
Escrevendo seus próprios hooks
Digamos que vários componentes precisam saber a largura da janela do navegador. Em vez de copiar a mesma lógica de useState e useEffect em cada um, você pode empacotar essa lógica uma 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
}Agora qualquer componente pode chamar const width = useWindowWidth() e obter um valor que se atualiza conforme a janela redimensiona. useWindowWidth é um hook customizado: uma função que chama outros hooks. Esse é o padrão completo, e porque é uma função, você pode dar a um pedaço de lógica com estado um nome, colocá-lo em um lugar, e reutilizá-lo entre componentes. O prefixo use é o que o marca como um hook, tanto para as ferramentas do React quanto para a próxima pessoa lendo seu código. Hooks customizados empacotam os hooks que você já tem em algo reutilizável; eles não adicionam novos poderes ao React.
use, e ele conecta seu componente a um recurso do React como memória ou efeitos. Você já conheceu useState e useEffect, e os outros seguem o mesmo padrão. A coisa principal a lembrar: chame hooks no topo do seu componente, nunca dentro de um if ou um loop, para que rodem do mesmo jeito a cada renderização.
Próximo: Thinking in React, onde componentes, props, estado, e efeitos se juntam em um processo para transformar um design em uma UI.

