[BFE.dev] Suspense 3

치만·2026년 1월 28일

BFE.dev react

목록 보기
22/28
post-thumbnail

Suspense 3

// This is a React Quiz from BFE.dev 

import * as React from 'react'
import { Suspense, useMemo } from 'react'
import { createRoot } from 'react-dom'

const resource = (() => {
  let data = null
  let status = 'pending'
  let fetcher = null
  return {
    get() {
      if (status === 'ready') {
        return data
      }
      if (status === 'pending') {
        fetcher = new Promise((resolve, reject) => {
          setTimeout(() => {
            data = 1
            status = 'ready'
            resolve()
          }, 100)
        })
        status = 'fetching'
      }

      throw fetcher
    }
  }
})()


function A() {
  console.log(1)
  const memoed = useMemo(() => {
    console.log(2)
    return 'memo'
  }, [])

  const data = resource.get()
  console.log(3)
  return memoed + data
}

function App() {
  return <Suspense fallback={null}>
    <A/>
  </Suspense>
}

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

출력 결과

1
2
1
2
3

풀이 과정

1. 초기 렌더링

  • 1 출력: root.render(<App />)가 실행되면서 <A/> 컴포넌트 내에 1이 출력됩니다.

  • 2 출력: <A/> 컴포넌트 내에 useMemo가 실행되어 2가 출력됩니다.

  • fallback 실행: Promise가 throw되면 렌더링을 중단하고 fallback을 실행합니다.


2. 상태 업데이트 후 재렌더링

profile
🌱개발 기록장

0개의 댓글