🔍 inp.works

React 리렌더 연쇄: 한 번의 클릭이 트리 전체를 리렌더할 때

무슨 일이 일어나는가

React에서 상태 업데이트는 해당 컴포넌트와, 기본적으로 모든 자식을 리렌더합니다. 상태가 트리 상단(컨텍스트, 페이지 수준 스토어)에 있으면 한 번의 키 입력이나 클릭이 수백 개의 컴포넌트를 리렌더할 수 있습니다 — 대부분은 이전과 정확히 같은 것을 표시합니다.

렌더 한 번은 저렴하지만, 한 핸들러에서 수천 번은 아닙니다. 그 작업은 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