Automatic batching

Automatic batching

batchingμ΄λž€ μ—…λ°μ΄νŠΈ λŒ€μƒμ΄ λ˜λŠ” μƒνƒœκ°’λ“€μ„ ν•˜λ‚˜λ‘œ λ¬Άμ–΄ ν•œλ²ˆμ˜ λ¦¬λ Œλ”λ§μ— μ—…λ°μ΄νŠΈκ°€ λͺ¨λ‘ μ§„ν–‰λ˜λ„λ‘ ν•΄μ£ΌλŠ” 것을 μ˜λ―Έν•œλ‹€.

const handleClick = () => {
  setCount(prev => prev + 1);
  setFlag(prev => !prev);
  // 였직 ν•œλ²ˆλ§Œ λ¦¬λ Œλ”λ§
}
  • ν•˜λ‚˜μ˜ ν•¨μˆ˜ λ‚΄μ—μ„œ setStateλ₯Ό μ—¬λŸ¬λ²ˆ ν˜ΈμΆœν•΄λ„ λ¦¬λ Œλ”λ§μ€ ν•œ 번만 λ°œμƒν•œλ‹€.

  • ν•¨μˆ˜μ˜ λμ—μ„œ μ—…λ°μ΄νŠΈ 되며 λ¦¬μ—‘νŠΈλŠ” λ§ˆμ§€λ§‰μ— ν•œλ²ˆ λ¦¬λ Œλ”λ§μ„ μ‹œν‚¨λ‹€.

  • μ—¬λŸ¬λ²ˆμ˜ λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§μ„ λ°©μ§€ν•˜κΈ° λ•Œλ¬Έμ— μ„±λŠ₯에 이점이 μžˆλ‹€.

v18 이전 λ²„μ „μ—μ„œλ„ batch updateκ°€ 지원 λ˜μ—ˆμ§€λ§Œ 클릭과 같은 λΈŒλΌμš°μ € μ΄λ²€νŠΈμ—μ„œλ§Œ 적용이 κ°€λŠ₯ν–ˆκ³  api 호좜 μ½œλ°±ν•¨μˆ˜λ‚˜ timeout ν•¨μˆ˜μ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•Šμ•˜λ‹€.

const handleClick = () => {
  somethingFetch().then(() => {
    setCount(prev => prev + 1); // re-render 1
    setFlag(prev => !prev); // re-render 2
  }) 
}

setTimeout(() => {
  setCount(prev => prev + 1); // re-rend er 1
  setFlag(prev => !prev); // re-render 2
});

React 18μ—μ„œμ˜ Batching

  • 이벀트 ν•Έλ“€λŸ¬ λ°–μ—μ„œλ„ λ™μž‘ν•˜λ„λ‘ λ³€κ²½λ˜μ—ˆλ‹€.

  • ν•„μš”ν•  λ•Œ bach μ—…λ°μ΄νŠΈλ₯Ό μ œμ™Έμ‹œν‚¬ 수 μžˆλŠ” κΈ°λŠ₯이 μΆ”κ°€ λ˜μ—ˆλ‹€.

batch μ—…λ°μ΄νŠΈλ₯Ό ν•˜μ§€ μ•ŠμœΌλ €λ©΄?

일반적인 μƒν™©μ—μ„œλŠ” 일괄 μ²˜λ¦¬κ°€ μ•ˆμ „ν•˜μ§€λ§Œ, 일뢀 μ½”λ“œλŠ” μƒνƒœ λ³€κ²½ 직후 DOMμ—μ„œ 무언가λ₯Ό μ½λŠ”λ° μ˜μ‘΄ν•  수 μžˆλ‹€. μ΄λŸ¬ν•œ 경우 ReactDOM.flushSync() λ₯Ό μ‚¬μš©ν•˜μ—¬ 일괄 처리λ₯Ό μ˜΅νŠΈμ•„μ›ƒ μ‹œν‚¬ 수 μžˆλ‹€.

import { flushSync } from 'react-dom';

const handleClick = () => {
  flushSync(() => {
    setCount(prev => prev + 1); // re-render
  })
  
  flushSync(() => {
    setFlag(prev => !prev); // re-render 2
  })
}

Last updated