Hooks
Digamos que um componente precisa lembrar se um dropdown está aberto, ou precisa executar algum código depois que renderiza para sincronizar com um servidor. Essas são tarefas para um hook. Você já usou dois deles: useState dá memória a um componente, e useEffect executa código após uma renderização para alcançar algo fora do React. Esses são os dois que você vai usar mais, e o resto dos built-ins segue o mesmo padrão: você chama uma função dentro do seu componente, e ela te conecta a uma parte da maquinaria do React. O nome dessa função sempre começa com use, e esse prefixo é a definição inteira de um hook.
Um tour pelos built-ins mais comuns
Você não precisa de todo hook no primeiro dia, mas ajuda saber o que tem disponível para reconhecer a ferramenta certa quando um problema chama por ela. Aqui estão os que aparecem mais:
useRefmantém um valor mutável que sobrevive 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, então um componente profundamente aninhado consegue alcançar um valor sem você passar ele por cada nível no meio do caminho.useReducergerencia estado através de uma função reducer, onde cada atualização descreve uma transição do estado atual para o próximo. É uma boa escolha quando mudanças de estado ficam complexas o suficiente para um únicouseStatecomeçar a apertar.useMemocacheia um valor calculado entre renderizações e só recalcula quando suas dependências mudam.useCallbackfaz o mesmo para uma função, te 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 depois, quando houver uma história real de performance para contar. Refs e o DOM pega useRef em profundidade. Para useContext e useReducer, este capítulo é o tratamento mais profundo que recebem, então volte aqui quando precisar relembrar. 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. Todo hook que um componente usa deveria 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('')
}
// Certo: chame no nível superior, incondicionalmente
const [name, setName] = useState('')
// ...depois use isLoggedIn dentro da sua lógica
}Segundo, chame hooks só de componentes de função React ou de outros hooks customizados. Funções JavaScript regulares não conseguem usar hooks, porque não há uma renderização de componente para o React anexar o estado.
Escrevendo seus próprios hooks
Digamos que vários componentes precisem saber a largura da janela do navegador. Em vez de copiar o mesmo 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 atualiza conforme a janela redimensiona. useWindowWidth é um hook customizado: uma função que chama outros hooks. Esse é o padrão inteiro, e porque é uma função, você consegue dar um nome a uma lógica com estado, colocá-la em um lugar, e reutilizá-la entre componentes. O prefixo use é o que a marca como um hook, tanto para a ferramenta do React quanto para a próxima pessoa lendo seu código. Hooks customizados agrupam os hooks que você já tem em algo reutilizável; eles não adicionam novos poderes ao React.
use, e ela conecta seu componente a um recurso do React como memória ou effects. Você já conheceu useState e useEffect, e os outros seguem o mesmo padrão. A coisa principal para lembrar: chame hooks no topo do seu componente, nunca dentro de um if ou um loop, então eles rodem do mesmo jeito a cada renderização. Próximo: Pensando em React, onde componentes, props, estado, e effects se juntam em um processo para transformar um design em uma UI.

