Pular para o conteúdo
~/.primo-academy.sh
☰ Aulas · React do Zero: Componentes, Estado e Hooks · 0/24
Recomendado: essencial

Estado derivado: calcule em vez de duplicar

1 min de leitura

fonte

Guardar no estado tudo que aparece na tela parece conveniente, mas pode criar duplicação. Se um valor pode ser calculado a partir de props ou outro estado, calcule-o durante a renderização.

import { useState } from 'react';

const products = [
  { id: 1, name: 'Catuaí', price: 34.9 },
  { id: 2, name: 'Bourbon', price: 39.5 },
  { id: 3, name: 'Geisha', price: 58.0 },
];

export default function ProductSearch() {
  const [query, setQuery] = useState('');

  const normalizedQuery = query.trim().toLowerCase();
  const filteredProducts = products.filter((product) =>
    product.name.toLowerCase().includes(normalizedQuery),
  );

  return (
    <section>
      <input
        aria-label="Buscar produto"
        value={query}
        onChange={(event) => setQuery(event.target.value)}
      />

      <p>{filteredProducts.length} resultado(s)</p>

      <ul>
        {filteredProducts.map((product) => (
          <li key={product.id}>{product.name}</li>
        ))}
      </ul>
    </section>
  );
}

Não precisamos de useState para filteredProducts nem de um useEffect para sincronizá-lo. Enquanto query for a fonte de verdade, o filtro sempre estará coerente com ela.

  • Estado mínimo: guarda apenas o que realmente muda de forma independente.
  • Valor derivado: é calculado de props/estado existentes.
  • Sincronização desnecessária: costuma ser sinal de estado duplicado.

Você já pode encarar o segundo projeto: Habit Tracker em React (habit-tracker-react), que pratica formulários, estado imutável, filtros e estatísticas derivadas.

No próximo nó, vamos aprender quando um Effect é realmente necessário.

// Quiz

Qual valor provavelmente não precisa de um useState próprio?

Escolha uma alternativa

// recursos

// avaliação da trilha

—
ainda sem avaliações