R
Interview Deckreact · next.js · senior/staff
0·0·122
React 18

useDeferredValue (Tearing)

Mantém uma versão 'atrasada' do valor enquanto o React processa em background, evitando tearing.

useDeferredValue é um hook que retorna uma versão 'defasada' de um valor. O React mantém o valor anterior estável enquanto processa o novo em prioridade baixa, evitando tearing (estados visuais inconsistentes).

Problema
Tearing: partes da UI mostram valores diferentes durante renders pesados — estado visual inconsistente.
Solução
useDeferredValue mantém o valor anterior estável enquanto o novo processa — sem estado partido.
Tip
useDeferredValue = para valores que alimentam renders pesados (filtros, listas, gráficos).
function ListaFiltrada({ filtro }) {
  const filtroDeferido = useDeferredValue(filtro);

  const resultado = useMemo(
    () => heavyFilter(data, filtroDeferido),
    [filtroDeferido]
  );

  const isUpdating = filtro !== filtroDeferido;

  return (
    <div style={{ opacity: isUpdating ? 0.6 : 1 }}>
      <Lista items={resultado} />
    </div>
  );
}
Q.useDeferredValue vs useTransition — qual usar?
A.useTransition quando você CONTROLA o setState (envolve a chamada). useDeferredValue quando recebe o valor de fora (props, contexto) e não pode envolver o setState.
Q.O que é tearing no React?
A.Estado visual inconsistente onde diferentes partes do componente mostram valores de versões diferentes do estado durante renders concorrentes. O Concurrent Mode pode interromper renders, e sem cuidado, partes podem ficar 'rasgadas'.
Q.useDeferredValue substitui debounce de input?
A.Pra renders pesados sim, é melhor. Pra calls de API ainda use debounce — useDeferredValue não atrasa execução, só prioriza.
4/122← →