Menu

React Hooks: todos os hooks explicados com exemplos ao vivo

Um hook é uma função cujo nome começa com use e que permite a um componente usar um recurso do React, como estado, context, refs ou efeitos. Veja todos os hooks embutidos agrupados por finalidade, as duas regras que todo hook segue e como escrever o seu próprio.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

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.

HookO que ele dá a vocêPágina
useStateUm valor que sobrevive às renderizações e um setter que renderiza de novouseState
useReducerEstado atualizado por uma função reducer e ações despachadasuseReducer
useContextUm valor fornecido por um pai, sem passar propsuseContext
useRefUma caixa mutável que sobrevive às renderizações, muitas vezes um nó do DOMuseRef
useImperativeHandleEscolhe o que um pai vê pela sua refforwardRef
useEffectCódigo que costuma executar depois da pintura: timers, assinaturas, busca de dadosuseEffect
useLayoutEffectCódigo que executa depois de o DOM atualizar, mas antes da pinturauseLayoutEffect
useInsertionEffectExecuta antes dos layout effects, para bibliotecas de CSS-in-JS
useEffectEventUma função que um efeito pode chamar e que sempre vê as props e o estado mais recentesuseEffect
useMemoGuarda em cache um valor calculado entre renderizaçõesuseMemo
useCallbackGuarda em cache uma função entre renderizaçõesuseCallback
useTransitionMarca uma atualização como não urgente e avisa enquanto ela está pendenteuseTransition
useDeferredValueUma cópia de um valor que fica para trás durante renderizações pesadasuseDeferredValue
useIdUm id único que coincide no servidor e no clienteuseId
useSyncExternalStoreAssina uma store que vive fora do ReactuseSyncExternalStore
useDebugValueUm rótulo para um hook personalizado no React DevTools
useLê uma promise ou um context, e pode ficar dentro de uma condiçãouse
useActionStateEstado que uma form action atualiza, com um indicador de pendênciauseActionState
useOptimisticMostra o resultado esperado antes de o servidor responderuseOptimistic
useFormStatusO 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:

  1. Chame hooks no nível superior do seu componente, nunca dentro de uma condição, de um loop ou de uma função aninhada.
  2. 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, ou useReducer quando 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: useMemo e useCallback. 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: useTransition ou useDeferredValue.

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.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR