Noções Básicas de Hooks do React
11 exemplos para você começar com os Hooks do React -- 7 básicos e 4 intermediários.
Busque em todas as páginas da documentação
11 exemplos para você começar com os Hooks do React -- 7 básicos e 4 intermediários.
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Os Hooks vêm com o próprio React -- nenhuma dependência extra é necessária. Um projeto React com TypeScript (Next.js, Vite ou CRA) é suficiente para executar todos os exemplos abaixo.
# If you do not already have a project:
npx create-next-app@latest my-app --typescript --tailwind --app
cd my-app
npm run devDuas regras se aplicam a todos os hooks nesta página:
Armazene um valor que aciona uma re-renderização sempre que ele muda.
import { useState } from "react";
function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount((c) => c + 1)}>
Count: {count}
</button>
);
}useState retorna um par [valor, setter].(c) => c + 1) quando o novo valor depender do anterior -- ele evita closures obsoletos.useState(0) é o valor inicial, usado apenas na primeira renderização.Relacionado: useState -- funções atualizadoras, inicialização preguiçosa, batching | Tipando Estado -- tipando formas complexas de estado
Execute um efeito colateral após a renderização -- assinando, agendando ou tocando APIs não-React.
import { useEffect, useState } from "react";
function Clock() {
const [now, setNow] = useState(() => new Date());
useEffect(() => {
const id = setInterval(() => setNow(new Date()), 1000);
return () => clearInterval(id);
}, []);
return <p>{now.toLocaleTimeString()}</p>;
}[] significa "executar uma vez ao montar"; listar variáveis significa "re-executar quando qualquer uma delas mudar".useEffect para dados que você pode buscar em um Server Component -- isso causa waterfalls e flicker de carregamento.Relacionado: useEffect -- limpeza, arrays de dependências, erros comuns | Busca Básica com SWR -- prefira isso para dados do lado do cliente
Mantenha um valor entre renderizações sem acionar uma re-renderização, ou referencie um nó DOM.
import { useEffect, useRef } from "react";
function AutoFocusInput() {
const inputRef = useRef<HTMLInputElement>(null);
useEffect(() => {
inputRef.current?.focus();
}, []);
return <input ref={inputRef} placeholder="Auto-focused" />;
}useRef retorna um objeto { current } que persiste entre renderizações.ref.current não aciona uma re-renderização -- ao contrário do estado.ref para obter um handle para o elemento DOM subjacente.Relacionado: useRef -- padrões de ref, encaminhamento, refs de callback | Tipando Refs -- tipos de ref para elementos e instâncias
Leia um valor de contexto em qualquer lugar da árvore sem prop drilling.
import { createContext, useContext } from "react";
const ThemeContext = createContext<"light" | "dark">("light");
function ThemedLabel() {
const theme = useContext(ThemeContext);
return (
<span className={theme === "dark" ? "text-white" : "text-black"}>Hi</span>
);
}
function App() {
return (
<ThemeContext.Provider value="dark">
<ThemedLabel />
</ThemeContext.Provider>
);
}useContext assina o componente ao contexto -- ele re-renderiza sempre que o value do provider muda."light" aqui) é usado apenas quando não há um provider correspondente acima na árvore.Relacionado: useContext -- providers, valores padrão, divisão de contextos | Padrões de Contexto -- quando e como dividir contextos | Contexto vs. Zustand -- escolhendo entre eles
Gerencie transições de estado complexas com atualizações baseadas em ações.
import { useReducer } from "react";
type Action = { type: "increment" } | { type: "decrement" } | { type: "reset" };
function reducer(state: number, action: Action): number {
switch (action.type) {
case "increment":
return state + 1;
case "decrement":
return state - 1;
case "reset":
return 0;
}
}
function Counter() {
const [count, dispatch] = useReducer(reducer, 0);
return (
<div>
<button onClick={() => dispatch({ type: "decrement" })}>-</button>
<span>{count}</span>
<button onClick={() => dispatch({ type: "increment" })}>+</button>
</div>
);
}useReducer quando o estado tiver múltiplos campos relacionados ou transições complexas que abrangeriam muitas chamadas useState.dispatch inválidas.useState em um componente, considere useReducer em vez disso.Relacionado: useReducer -- padrões de ação, inicialização preguiçosa, estado aninhado | Uniões Discriminadas -- formas de ação type-safe
Memorize um cálculo caro para que ele só re-execute quando suas entradas mudarem.
import { useMemo, useState } from "react";
function ProductList({ products }: { products: { id: number; price: number }[] }) {
const [filter, setFilter] = useState("");
const total = useMemo(
() => products.reduce((sum, p) => sum + p.price, 0),
[products]
);
return (
<div>
<input value={filter} onChange={(e) => setFilter(e.target.value)} />
<p>Total: ${total}</p>
</div>
);
}useMemo recalcula o valor apenas quando as dependências mudam, pulando trabalho em re-renderizações não relacionadas.useMemo prematuro adiciona sobrecarga de código sem ganho de performance.useMemo se tornam desnecessárias -- o compilador memoriza automaticamente.Relacionado: useMemo -- quando a memorização realmente ajuda | Compilador React -- auto-memorização no React 19 | Memorização -- padrões de performance mais amplos
Memorize uma referência de função para que ela permaneça estável entre renderizações.
import { useCallback, useState } from "react";
function SearchBox({ onSearch }: { onSearch: (q: string) => void }) {
return <input onChange={(e) => onSearch(e.target.value)} />;
}
function App() {
const [query, setQuery] = useState("");
const handleSearch = useCallback((q: string) => {
setQuery(q);
}, []);
return (
<>
<SearchBox onSearch={handleSearch} />
<p>Query: {query}</p>
</>
);
}useCallback(fn, deps) é equivalente a useMemo(() => fn, deps).React.memo) ou listá-lo como dependência em useEffect.useMemo, evite uso prematuro -- o Compilador React lida com a maioria dos casos no React 19.Relacionado: useCallback -- padrões e armadilhas | useMemo -- primitivo irmão | Re-renderizações -- quando a identidade do callback importa
Extraia lógica com estado para uma função reutilizável.
import { useEffect, useState } from "react";
function useOnlineStatus() {
const [isOnline, setIsOnline] = useState(() =>
typeof navigator === "undefined" ? true : navigator.onLine
);
useEffect(() => {
const on = () => setIsOnline(true);
const off = () => setIsOnline(false);
window.addEventListener("online", on);
window.addEventListener("offline", off);
return () => {
window.removeEventListener("online", on);
window.removeEventListener("offline", off);
};
}, []);
return isOnline;
}
function StatusBanner() {
const isOnline = useOnlineStatus();
return <p>You are {isOnline ? "online" : "offline"}</p>;
}use e pode chamar outros hooks.navigator, window) precisam de guardas para a renderização do servidor.Relacionado: Custom Hooks -- regras, testes, padrões | Guia de Custom Hooks -- padrões mais amplos | useToggle -- um hook customizado do mundo real
Marque uma atualização de estado como não urgente para que a UI permaneça responsiva.
import { useState, useTransition } from "react";
function FilterableList({ items }: { items: string[] }) {
const [query, setQuery] = useState("");
const [filtered, setFiltered] = useState(items);
const [isPending, startTransition] = useTransition();
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setQuery(e.target.value);
startTransition(() => {
setFiltered(items.filter((i) => i.includes(e.target.value)));
});
};
return (
<div>
<input value={query} onChange={handleChange} />
{isPending && <p>Updating...</p>}
<ul>
{filtered.map((i) => (
<li key={i}>{i}</li>
))}
</ul>
</div>
);
}startTransition são de baixa prioridade -- o React pode interrompê-las se o usuário digitar novamente.isPending permite mostrar um indicador de carregamento sutil durante o trabalho adiado.<form action={...}> em uma transição automaticamente -- nenhum startTransition explícito é necessário para ações de formulário.Relacionado: useTransition -- padrões e armadilhas | useDeferredValue -- hook irmão para adiar um valor em vez de uma atualização
Controle uma ação de formulário e rastreie seu estado pendente e resultado em uma única chamada.
"use client";
import { useActionState } from "react";
async function submitFeedback(_prev: string | null, formData: FormData) {
const message = formData.get("message") as string;
if (!message) return "Message is required.";
await fetch("/api/feedback", { method: "POST", body: formData });
return null;
}
function FeedbackForm() {
const [error, action, isPending] = useActionState(submitFeedback, null);
return (
<form action={action}>
<textarea name="message" />
{error && <p>{error}</p>}
<button type="submit" disabled={isPending}>
{isPending ? "Sending..." : "Send"}
</button>
</form>
);
}[state, action, isPending] -- conecte a action diretamente a <form action={action}>.FormData; seu valor de retorno se torna o próximo estado.useFormState do React 18 -- mesma API, novo nome.Relacionado: useActionState -- API completa e padrões | Server Actions -- o lado do servidor do par | Formulários de Server Action -- padrões de formulário ponta a ponta
Leia uma promise ou contexto inline -- sem .then, sem useEffect.
"use client";
import { Suspense, use } from "react";
interface User {
id: number;
name: string;
}
function UserCard({ userPromise }: { userPromise: Promise<User> }) {
const user = use(userPromise);
return <h2>{user.name}</h2>;
}
function UserPage({ userPromise }: { userPromise: Promise<User> }) {
return (
<Suspense fallback={<p>Loading...</p>}>
<UserCard userPromise={userPromise} />
</Suspense>
);
}use(promise) suspende o componente até que a promise resolva -- o <Suspense> pai mostra o fallback.use(context) lê um valor de contexto e, ao contrário de useContext, pode ser chamado condicionalmente dentro de blocos if.useEffect.Relacionado: use -- detalhes completos da API | Suspense -- o mecanismo de fallback | Server Components -- de onde as promises geralmente se originam
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥