본문 바로가기
IT/react

React - batching

by 내일은교양왕 2023. 6. 22.

개념
여러 개의 state 업데이트를 하나의 리렌더링 (re-render)로 묶는 것

이유
기존에는 각 state가 변경될 때마다 re-renderning이 발생하여 불필요하게 re-rendering이 많이 발생했다.

function App() {
  const [count, setCount] = useState(0);
  const [active, setActive] = useState(false);

  function handleClick() {
    setCount((c) => c + 1); //Nothing happens
    setActive((f) => !f); //Nothing happens
    //rerender component after this function runs. this is batching.
  }

  return (
    <div>
      <button onClick={handleClick}>{active}</button>
      <h1>{count}</h1>
    </div>
  );
}


React 18 미만, 18 + ReactDOM.render()
React 이벤트 핸드러 내부에서 발생하는 업데이트만 배칭이 가능.
그 외 Promise, setTimeout, Native event handler에서는 배칭이 되지 않는다.

 

setTimeout(() => {
  setCount((c) => c + 1); //rerender
  setActive((f) => !f); //rerender
}, 1000)


React 18
React 18 + createRoot로 Automatic batching이 가능하다.
Automatic batching이란 React는 업데이트의 발생지점과 무관하게 자동으로 업데이트를 배칭하는 것

이전버전에서 안됐던 상황에서도 가능하다는 뜻이다.

setTimeout

 

setTimeout(() => {
  setCount((c) => c + 1); //Nothing happens
  setActive((f) => !f); //Nothing happens
  //rerender component after this function runs. this is batching.
}, 1000)

 

fetch

fetch().then(() => {
  setCount((c) => c + 1); //Nothing happens
  setActive((f) => !f); //Nothing happens
  // rerender component after this function runs. this is batching.
})

 

Native event handler

btn.addEventListener('click', () => {
  setCount((c) => c + 1); //Nothing happens
  setActive((f) => !f); //Nothing happens
 //rerender component after this function runs. this is batching.
})

 

'IT > react' 카테고리의 다른 글

React - Virtual Dom  (0) 2023.06.22
React - List Key의 중요성  (0) 2023.06.22
React - Ref 에러 잡기  (0) 2023.06.18
React component, preload 로 최적화 하기  (0) 2023.05.27
Code splitting using 'Loadable'  (0) 2023.05.27