🔍 inp.works

Reactの再レンダリング連鎖:1クリックでツリー全体が再レンダリングされるとき

何が起きているか

Reactでは、状態更新はそのコンポーネントと、既定では全ての子を再レンダリングします。状態がツリーの上位(コンテキストやページレベルのストア)にあると、1回のキー入力やクリックで数百のコンポーネントが再レンダリングされ得ます — その多くは前とまったく同じものを表示します。

1回のレンダリングは安価ですが、1つのハンドラーで数千回は違います。その作業はINPのprocessing timeフェーズに入ります。

見分け方

直し方

問題

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)} />
  </>
}

修正

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} />
  </>
}
サイトを無料でスキャン →
Advertise here