🔍 inp.works

Cascata di re-render di React: quando un clic ri-renderizza l'intero albero

Cosa succede

In React, un aggiornamento di stato ri-renderizza il componente e, per impostazione predefinita, tutti i suoi figli. Se lo stato vive in alto nell'albero (un context, uno store a livello di pagina), una singola pressione di tasto o un clic può ri-renderizzare centinaia di componenti — la maggior parte dei quali mostra esattamente la stessa cosa di prima.

Ogni render è economico; migliaia in un singolo gestore non lo sono. Il lavoro finisce nella fase di processing time dell'INP.

Come riconoscerlo

Come risolverlo

Problema

const Page = () => {
  const [query, setQuery] = useState("")
  // every keystroke re-renders Page → Header, Sidebar, BigTable, Footer
  return <>
    <SearchInput value={query} onChange={setQuery} />
    <BigTable rows={filterRows(rows, query)} />
  </>
}

Soluzione

const BigTable = React.memo(({ rows }) => /* ... */)

const Page = () => {
  const [query, setQuery] = useState("")
  const [isPending, startTransition] = useTransition()
  const rows = useMemo(() => filterRows(allRows, query), [query])
  const onChange = (q) =>
    startTransition(() => setQuery(q))  // input paints first, table follows
  return <>
    <SearchInput onChange={onChange} />
    <BigTable rows={rows} />
  </>
}
Scansiona il tuo sito gratis →
Advertise here