[BFE.dev] flushSync()

치만·2026λ…„ 1μ›” 21일

BFE.dev react

λͺ©λ‘ 보기
17/28
post-thumbnail

flushSync()

πŸ‘‰ flushSync : 일반적으둜 μ‚¬μš©λ˜μ§€ μ•Šκ³ , μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ €ν•˜λ₯Ό μΌμœΌν‚¬ 수 μžˆμ–΄ μ‚¬μš© μ‹œ μ£Όμ˜κ°€ ν•„μš”ν•¨

// This is a React Quiz from BFE.dev


import * as React from 'react'
import { useState } from 'react'
import { createRoot, flushSync } from 'react-dom/client'
import { screen, fireEvent } from "@testing-library/dom";

function App() {
  const [state, setState] = useState(0)
  const onClick = () => {
    console.log('handler')
    flushSync(() => {
      setState(state => state + 1)
    })
    console.log('handler ' + state)
  }
  console.log('render ' + state)
  return <div>
    <button onClick={onClick}>click me</button>
  </div>
}

const root = createRoot(document.getElementById("root"));
root.render(<App />);

(async function () {
  const action = await screen.findByText('click me')
  fireEvent.click(action);
})()

좜λ ₯ κ²°κ³Ό

"render 0"
"handler"
"render 1"
"handler 0"

풀이 κ³Όμ •

1. 초기 λ Œλ”λ§

  • render 0 좜λ ₯: root.render(<App />)κ°€ μ‹€ν–‰λ˜λ©΄μ„œ state의 μ΄ˆκΈ°κ°’μΈ 0으둜 첫 λ Œλ”λ§μ΄ μΌμ–΄λ‚©λ‹ˆλ‹€.

  • handler 좜λ ₯: λ²„νŠΌ 클릭 직후 onClick ν•Έλ“€λŸ¬ λ‚΄μ˜ 첫 번째 console.logκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.


2. μƒνƒœ μ—…λ°μ΄νŠΈ ν›„ μž¬λ Œλ”λ§

  • render 1 좜λ ₯: flushSync λ‚΄λΆ€μ—μ„œ setStateκ°€ 호좜되면 ReactλŠ” ν•Έλ“€λŸ¬κ°€ λλ‚˜κΈΈ 기닀리지 μ•Šκ³  κ·Έ μ¦‰μ‹œ App을 λ¦¬λ Œλ”λ§ν•©λ‹ˆλ‹€. onClick ν•¨μˆ˜κ°€ λλ‚˜κΈ°λ„ 전에 λ¦¬λ Œλ”λ§ console.logκ°€ λ¨Όμ € μ°νž™λ‹ˆλ‹€.

  • handler 0 좜λ ₯: λ¦¬λ Œλ”λ§μ€ λλ‚¬μ§€λ§Œ onClick ν•¨μˆ˜ λ‚΄μ˜ state λ³€μˆ˜λŠ” ν΄λ‘œμ € ν˜„μƒ λ•Œλ¬Έμ— μ—¬μ „νžˆ ν•¨μˆ˜κ°€ μ‹œμž‘λ  λ•Œμ˜ 값인 0을 μ°Έμ‘°ν•©λ‹ˆλ‹€.

profile
🌱개발 기둝μž₯

0개의 λŒ“κΈ€