React hooks são funções cujos nomes começam com use e que permitem a um componente de função usar recursos do React: useState para lembrar um valor, useEffect para executar código depois da renderização, useRef para guardar um nó do DOM, useContext para ler dados compartilhados. Você os chama no topo do seu componente, e o React mantém os valores deles entre renderizações.
Quatro hooks trabalham juntos aqui. O useState guarda o texto, o useRef aponta para o input para que o botão possa focá-lo, o useMemo mantém a lista filtrada até a busca mudar e o useEffect registra depois de cada renderização em que a busca mudou. Digite an e observe o Console: uma linha por tecla, depois que a lista atualiza.
Por que os hooks existem
Antes do React 16.8, um componente que precisava de estado ou de código de ciclo de vida tinha que ser uma classe. A lógica de uma funcionalidade ficava dividida entre componentDidMount, componentDidUpdate e componentWillUnmount, e compartilhá-la entre componentes significava mixins (que nunca funcionaram com a sintaxe de classes), higher order components ou render props, todos envolvendo a sua árvore em camadas extras.
// 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>;
}
}
Com hooks, a mesma funcionalidade fica em um só lugar: o efeito inicia o timer e a limpeza dele o para.
Esconda o relógio e o Console imprime timer stopped: o React executou a limpeza quando Clock saiu da tela. Mostre de novo e um timer novo começa. Componentes de classe ainda funcionam no React 19, mas código novo usa hooks.
Todos os hooks embutidos
O React 19.2 agrupa os hooks pelo que eles dão a um componente. Você vai usar os dois primeiros grupos todos os dias e o resto quando um problema específico pedir.
| Hook | O que ele dá a você | Página |
|---|---|---|
useState | Um valor que sobrevive às renderizações e um setter que renderiza de novo | useState |
useReducer | Estado atualizado por uma função reducer e ações despachadas | useReducer |
useContext | Um valor fornecido por um pai, sem passar props | useContext |
useRef | Uma caixa mutável que sobrevive às renderizações, muitas vezes um nó do DOM | useRef |
useImperativeHandle | Escolhe o que um pai vê pela sua ref | forwardRef |
useEffect | Código que costuma executar depois da pintura: timers, assinaturas, busca de dados | useEffect |
useLayoutEffect | Código que executa depois de o DOM atualizar, mas antes da pintura | useLayoutEffect |
useInsertionEffect | Executa antes dos layout effects, para bibliotecas de CSS-in-JS | |
useEffectEvent | Uma função que um efeito pode chamar e que sempre vê as props e o estado mais recentes | useEffect |
useMemo | Guarda em cache um valor calculado entre renderizações | useMemo |
useCallback | Guarda em cache uma função entre renderizações | useCallback |
useTransition | Marca uma atualização como não urgente e avisa enquanto ela está pendente | useTransition |
useDeferredValue | Uma cópia de um valor que fica para trás durante renderizações pesadas | useDeferredValue |
useId | Um id único que coincide no servidor e no cliente | useId |
useSyncExternalStore | Assina uma store que vive fora do React | useSyncExternalStore |
useDebugValue | Um rótulo para um hook personalizado no React DevTools | |
use | Lê uma promise ou um context, e pode ficar dentro de uma condição | use |
useActionState | Estado que uma form action atualiza, com um indicador de pendência | useActionState |
useOptimistic | Mostra o resultado esperado antes de o servidor responder | useOptimistic |
useFormStatus | O estado pendente do formulário pai (de react-dom) |
use, useActionState, useOptimistic e useFormStatus chegaram com o React 19, e o useEffectEvent ficou estável no 19.2. Todos os outros hooks da lista também funcionam no React 18.
Estado renderiza, refs não
Nem todo hook dispara uma renderização. useState e useReducer disparam: mude o valor deles e o React desenha o componente de novo. O useRef entrega um objeto cujo campo current você pode mudar à vontade, e o React nunca renderiza de novo por causa dele. Isso o torna o lugar certo para o id de um timer, um valor anterior ou uma contagem que a tela não mostra.
O useReducer guarda o carrinho e o useState guarda a anotação; os dois causam uma renderização quando mudam, e o efeito registra uma linha por renderização. O efeito também muda commits.current, mas essa mudança nunca causa uma renderização própria, então o log não entra em loop. A contagem é atualizada em um efeito em vez de no corpo do componente porque o corpo não deve mudar nada enquanto renderiza.
As regras dos hooks
Todo hook segue duas regras:
- Chame hooks no nível superior do seu componente, nunca dentro de uma condição, de um loop ou de uma função aninhada.
- Chame hooks só a partir de componentes de função ou dos seus próprios hooks personalizados.
O React não conhece os hooks pelo nome. Ele os conhece pela ordem em que você os chama e espera que essa ordem seja a mesma em toda renderização. Um hook dentro de um if deslocaria todos os hooks depois dele. A página sobre as regras dos hooks mostra o que quebra e como corrigir. O use é a única exceção: ele pode ser chamado dentro de uma condição.
O seu primeiro hook personalizado
Quando dois componentes precisam da mesma lógica com estado, leve-a para uma função cujo nome começa com use. Essa função pode chamar qualquer outro hook. Cada componente que a chama recebe o próprio estado.
Os dois contadores executam o mesmo hook, mas clicar em um não mexe no outro: um hook personalizado compartilha lógica, não estado. Adicione uma função decrement ao useCounter e um botão que a chame, e os dois contadores a ganham de uma vez. Mais padrões (useToggle, useDebounce, useLocalStorage) estão na página de hooks personalizados.
Qual hook usar
- A tela deve mudar quando um valor muda:
useState, ouuseReducerquando muitos eventos atualizam o mesmo estado. - Você precisa conversar com algo fora do React (um timer, uma assinatura, uma requisição):
useEffect. - Você precisa de um nó do DOM ou de um valor que a tela não mostra:
useRef. - Muitos componentes no fundo da árvore precisam do mesmo valor:
useContext. - Uma renderização é lenta por causa de um cálculo ou porque um filho memoizado renderiza de novo:
useMemoeuseCallback. O React Compiler pode adicionar essa memoização por você, mas escrevê-la à mão ainda funciona e ainda é comum. - A digitação parece travada porque a atualização por trás dela é pesada:
useTransitionouuseDeferredValue.
Perguntas frequentes
O que são hooks no React?
Hooks são funções cujos nomes começam com use e que permitem a um componente de função usar recursos do React: useState para estado, useEffect para efeitos colaterais, useContext para context, useRef para valores que sobrevivem às renderizações sem causar uma, e outros.
Por que os hooks foram adicionados ao React?
Antes dos hooks (React 16.8), estado e métodos de ciclo de vida só existiam em componentes de classe, e compartilhar lógica com estado exigia mixins, higher order components ou render props. Os hooks colocam essa lógica em funções comuns que você pode chamar de qualquer componente de função e compartilhar como hooks personalizados.
Quantos hooks o React tem?
O React 19.2 traz cerca de vinte hooks embutidos no pacote react, mais o useFormStatus em react-dom. A maioria dos apps usa alguns todos os dias: useState, useEffect, useRef, useContext, useMemo e useCallback.
Posso usar hooks em componentes de classe?
Não. Hooks só funcionam dentro de componentes de função e de outros hooks. Você ainda pode renderizar um componente de classe ao lado de componentes de função, e uma classe pode renderizar um componente de função que usa hooks.
O que é um hook personalizado?
Uma função sua cujo nome começa com use e que chama outros hooks. Ela permite que vários componentes reutilizem a mesma lógica com estado, enquanto cada componente que a chama continua recebendo o próprio estado separado.