purity

Valida que componentes/hooks são puros verificando se eles não chamam funções conhecidas como impuras.

Detalhes da Regra

Componentes React devem ser funções puras - dadas as mesmas props, eles devem sempre retornar o mesmo JSX. Quando componentes usam funções como Math.random() ou Date.now() durante a renderização, eles produzem saídas diferentes a cada vez, quebrando as suposições do React e causando erros como incompatibilidades de hidratação, memoização incorreta e comportamento imprevisível.

Violações Comuns

Em geral, qualquer API que retorna um valor diferente para as mesmas entradas viola esta regra. Exemplos comuns incluem:

  • Math.random()
  • Date.now() / new Date()
  • crypto.randomUUID()
  • performance.now()

Inválido

Exemplos de código incorreto para esta regra:

// ❌ Math.random() na renderização
function Component() {
const id = Math.random(); // Diferente a cada renderização
return <div key={id}>Content</div>;
}

// ❌ Date.now() para valores
function Component() {
const timestamp = Date.now(); // Muda a cada renderização
return <div>Created at: {timestamp}</div>;
}

Válido

Exemplos de código correto para esta regra:

// ✅ IDs estáveis a partir do estado inicial
function Component() {
const [id] = useState(() => crypto.randomUUID());
return <div key={id}>Content</div>;
}

Solução de Problemas

Preciso mostrar a hora atual

Chamar Date.now() durante a renderização torna seu componente impuro:

// ❌ Errado: A hora muda a cada renderização
function Clock() {
return <div>Current time: {Date.now()}</div>;
}

Em vez disso, mova a função impura para fora da renderização:

function Clock() {
const [time, setTime] = useState(() => Date.now());

useEffect(() => {
const interval = setInterval(() => {
setTime(Date.now());
}, 1000);

return () => clearInterval(interval);
}, []);

return <div>Current time: {time}</div>;
}