Estado derivado | React
- Estado derivado | React
Derived State no React refere-se ao estado que é calculado (ou "derivado") com base em algum outro estado ou propriedade já existente no componente. Ao invés de armazenar diretamente valores que podem ser computados dinamicamente a partir de outras informações, derivamos esses valores quando necessário para evitar inconsistências e simplificar o código.
Por que evitar armazenar estados derivados?
Suponha que você tenha um count (estado) e queira exibir algum valor que dependa de count, por exemplo, dobro = count * 2. Há duas abordagens:
-
Armazenar apenas
countno estado e calculardobroquando precisar:function MyComponent() {
const [count, setCount] = useState(0);
const dobro = count * 2;
return (
<div>
<p>Count: {count}</p>
<p>Dobro: {dobro}</p>
<button onClick={() => setCount((prev) => prev + 1)}>Incrementar</button>
</div>
);
}- Vantagem: sempre que
countmuda,dobropermanece consistente sem esforço adicional. - Desvantagem: você recalcula o
dobroem cada renderização, mas esse cálculo é simples e não traz sobrecarga significativa. Em geral, lidar com cálculos leves em cada render é mais seguro do que manter estados em duplicidade que podem divergir.
- Vantagem: sempre que
-
Manter
countedobrocomo estados distintos:function MyComponent() {
const [count, setCount] = useState(0);
const [dobro, setDobro] = useState(0);
const incrementar = () => {
setCount((prev) => prev + 1);
setDobro((prev) => prev + 2); // Sincronizando manualmente
};
return (
<div>
<p>Count: {count}</p>
<p>Dobro: {dobro}</p>
<button onClick={incrementar}>Incrementar</button>
</div>
);
}- Vantagem: se o cálculo de
dobrofosse muito complexo, armazená-lo poderia economizar processamento em renders futuros. - Desvantagem: você agora tem duas "fontes de verdade" que precisam ser mantidas em sincronia. Qualquer falha de sincronização (por exemplo, esquecer de atualizar
dobroou atualizar com valor errado) causa bugs.
- Vantagem: se o cálculo de
No geral, React recomenda armazenar somente o que for necessário para o estado e derivar o resto no momento do render. Assim, você minimiza riscos de inconsistência.
Em que casos vale a pena armazenar estado derivado?
Há situações em que um cálculo derivado é muito custoso e não é prático recalcular a cada render. Exemplos extremos podem incluir parsing pesado, transformações complexas de dados ou renderizações em listas enormes. Nesses casos, algumas estratégias são:
-
Memoização com hooks como
useMemo:const valorDerivado = useMemo(() => {
// Cálculo pesado aqui
return calculaValorPesado(estadoOuProps);
}, [estadoOuProps]);- Dessa forma,
valorDerivadosó é recalculado quandoestadoOuPropsmudar, e não é armazenado diretamente no estado. Você evita reconstruir esse valor em cada render “à toa”.
- Dessa forma,
-
Armazenar em estado (como último recurso)
- Se nem memoização nem outras técnicas suprem o problema, é possível armazenar o valor derivado em um estado próprio. Mas é fundamental garantir que esse estado seja sempre atualizado quando a dependência mudar, senão você introduz inconsistências no app.
“Derived State” vs. “getDerivedStateFromProps”
Historicamente, o conceito de “Derived State” também aparecia em ciclos de vida de classes React (método estático getDerivedStateFromProps) para criar um estado baseados em props. É fortemente desencorajado abusar dessa técnica; a recomendação atual (usando Hooks) é, se possível, derivar valores dinamicamente ou usar memoização ao invés de manter estados duplicados.