Hook useMemo
Cache the result of an expensive computation between renders.
Busque em todas as páginas da documentação
useMemoCache the result of an expensive computation between renders.
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Cartão de receita de referência rápida - pronto para copiar e colar.
const memoizedValue = useMemo(() => computeExpensive(a, b), [a, b]);
// Memoiza um array/objeto derivado para estabilizar referências
const filtered = useMemo(
() => items.filter((item) => item.active),
[items]
);Quando usar: Você tem um cálculo caro que não deve ser reexecutado a cada renderização, ou você precisa de uma referência de objeto/array estável para um array de dependências ou prop de filho.
"use client";
import { useMemo, useState } from "react";
function fibonacci(n: number): number {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
export function FibonacciCalculator() {
const [num, setNum] = useState(10);
const [theme, setTheme] = useState<"light" | "dark">("light");
const result = useMemo(() => fibonacci(num), [num]);
return (
<div className={theme === "dark" ? "bg-gray-900 text-white p-4" : "bg-white text-black p-4"}>
<label className="flex items-center gap-2">
n =
<input
type="number"
value={num}
onChange={(e) => setNum(Number(e.target.value))}
className="w-20 border rounded px-2 py-1"
max={40}
/>
</label>
<p className="mt-2 font-mono">fibonacci({num}) = {result}</p>
<button
onClick={() => setTheme((t) => (t === "light" ? "dark" : "light"))}
className="mt-2 px-3 py-1 border rounded text-sm"
>
Alternar tema
</button>
</div>
);
}O que isso demonstra:
fibonacci é memoizado e só recalcula quando num mudauseMemo, cada re-renderização (incluindo a alternância de tema) reexecutaria o cálculo caroObject.isuseMemo é uma otimização de desempenho, não uma garantia semântica - o React pode descartar o cache em alguns casos (por exemplo, componentes fora da tela)| Parâmetro | Tipo | Descrição |
|---|---|---|
factory | () => T | Função que calcula o valor a ser memoizado |
dependencies | unknown[] | Array de valores reativos dos quais o cálculo depende |
| Retorno | Tipo | Descrição |
|---|---|---|
memoizedValue | T | Resultado em cache da função de fábrica |
Estabilizar um objeto para um array de dependências:
const options = useMemo(
() => ({ page, pageSize, sortBy }),
[page, pageSize, sortBy]
);
useEffect(() => {
fetchData(options);
}, [options]);Memoizar uma lista filtrada/ordenada:
const sortedUsers = useMemo(
() => [...users].sort((a, b) => a.name.localeCompare(b.name)),
[users]
);Memoizar uma árvore de componentes (raro):
const chart = useMemo(
() => <ExpensiveChart data={data} />,
[data]
);// O tipo de retorno é inferido da fábrica
const total = useMemo(() => items.reduce((sum, i) => sum + i.price, 0), [items]);
// total: number
// Genérico explícito quando a inferência é muito ampla
const config = useMemo<Config>(() => ({ retries: 3, timeout: 5000 }), []);Otimização prematura - Envolver cada valor em useMemo adiciona complexidade sem benefício mensurável para cálculos baratos. Correção: Perfilar primeiro. Memoize apenas quando você puder medir um problema de desempenho.
Dependências ausentes - Omitir uma dependência faz com que o valor memoizado fique desatualizado. Correção: Inclua todos os valores reativos usados dentro da fábrica.
Referências de dependência instáveis - Se uma dependência for um novo objeto/array a cada renderização, useMemo recalcula de qualquer maneira a cada vez. Correção: Memoize a própria dependência ou reestruture para depender de primitivos.
Efeitos colaterais na fábrica - useMemo é executado durante a renderização; efeitos colaterais (buscas, assinaturas) quebram as regras do React. Correção: Mova efeitos colaterais para useEffect ou manipuladores de eventos.
Não é uma garantia - O React pode descartar valores memoizados para componentes fora da tela e recalcular mais tarde. Correção: Nunca confie em useMemo para correção - apenas para desempenho.
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Sem memoização | O cálculo é barato (concatenação de strings, matemática simples) | O cálculo é mensuravelmente lento |
React.memo | Você quer pular a re-renderização de um componente filho inteiro | Você precisa memoizar um valor, não um componente |
useCallback | Você precisa de uma referência de função estável, não de um valor estável | Você precisa armazenar em cache um valor não-função |
useDeferredValue | Você quer adiar a renderização de conteúdo caro sem bloquear a entrada | Você precisa armazenar em cache resultados de cálculo |
| Computação no lado do servidor | Trabalho caro pode acontecer em tempo de compilação ou tempo de solicitação | Os dados dependem do estado do lado do cliente |
Quando vale a pena? Como regra geral, memoize quando o cálculo leva mais de ~1ms ou quando o resultado é usado como dependência para useEffect, useCallback, ou passado para um filho React.memo.
useMemo quando o cálculo levar mais de ~1ms (perfilar primeiro).useEffect, useCallback, ou passado para um filho React.memo.useMemo.useMemo é uma otimização de desempenho, não uma garantia semântica.Object.is, então uma nova referência significa "mudou".useMemo(() => value, deps) armazena em cache o valor de retorno da função de fábrica.useCallback(fn, deps) armazena em cache a própria função (equivalente a useMemo(() => fn, deps)).useMemo para valores, useCallback para funções.useMemo é executado durante a renderização, então efeitos colaterais (buscas, assinaturas, mutações de DOM) quebram as regras do React.useEffect ou manipuladores de eventos.const options = useMemo(
() => ({ page, pageSize, sortBy }),
[page, pageSize, sortBy]
);
useEffect(() => {
fetchData(options);
}, [options]); // referência estável, o efeito só reexecuta quando os valores mudaminterface Config {
retries: number;
timeout: number;
}
const config = useMemo<Config>(
() => ({ retries: 3, timeout: 5000 }),
[]
);
// config: ConfiguseMemo tem sobrecarga - armazenar o valor, comparar dependências e manter o cache.const chart = useMemo(
() => <ExpensiveChart data={data} />,
[data]
);data não mudou.React.memo no próprio componente para a maioria dos casos.useMemo é para computação no lado do cliente que depende do estado do cliente.useMemo(() => items.reduce((sum, i) => sum + i.price, 0), [items]) infere number.useMemo para funçõesuseMemo para evitar reexecutar efeitosRevisado por Chris St. John·Última atualização: 16 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥