ilokesto

Mount

Mount는 직접 전달한 React node를 즉시 렌더링합니다. 비동기 작업은 Promise를 반환하는 factory로 전달해야 합니다. 직접 Promise 및 PromiseLike child는 React 18과 React 19 type 모두에서 지원하지 않습니다.

import { Mount } from '@ilokesto/utilinent';

<Mount fallback={<p>Preparing preview...</p>}>
  {async () => <Preview data={await loadPreview()} />}
</Mount>

프로퍼티

PropType설명
childrenMountNode | (() => ReactNode | Promise<ReactNode>)직접 node 또는 동기/비동기 node factory입니다. MountNode는 PromiseLike 값을 제외한 ReactNode입니다.
fallbackReactNodeFactory의 초기 출력이며 Promise가 pending인 동안과 error 이후에 유지됩니다. 기본값은 null입니다.
onError(error: unknown) => void현재 factory가 throw 또는 reject하면 원래 error를 받습니다.

Factory로만 비동기 작업 전달하기

비동기 작업은 child factory 안에서 호출하세요.

<Mount fallback={<Spinner />} onError={reportError}>
  {() => loadPreview().then((preview) => <Preview data={preview} />)}
</Mount>

Render 중에 작업을 시작하고 그 Promise를 children으로 직접 전달하지 마세요. React 19가 promise를 ReactNode에 포함하더라도 직접 Promise<ReactElement>, Promise<string>, 기타 PromiseLike child는 public type과 runtime contract 모두에서 의도적으로 지원하지 않습니다.

실행 시점, 대체 UI, 오류

  • 직접 node는 초기 출력이며 fallback을 사용하지 않습니다.
  • Function child는 fallback으로 시작합니다. Mount는 commit 이후 layout effect에서 function을 호출합니다.
  • 동기 결과는 해당 effect에서 fallback을 교체하며, 일반적으로 browser paint 전에 반영됩니다.
  • Promise 결과가 pending인 동안에는 fallback이 계속 보입니다.
  • 동기 throw 또는 현재 Promise의 rejection은 fallback을 유지하고, 기존 console error를 기록하며, 실패한 invocation에 대해 onError를 한 번 호출합니다.
  • React Strict Mode는 development에서 effect를 다시 실행할 수 있으므로 factory는 여러 번 호출되어도 안전해야 합니다.

태그 형태

<Mount.div fallback={<Spinner />} className="preview">
  {() => <Preview />}
</Mount.div>

경합 안전성

children이 바뀌면 더 최신 call이 시작됩니다. 이전 call의 fulfillment 또는 rejection은 무시되므로 현재 출력을 교체할 수 없고 onError도 호출하지 않습니다. Unmount 이후 settlement도 같은 방식으로 무시합니다. Pending 비동기 작업을 직접 node로 교체하면 해당 node를 즉시 표시합니다.

불필요하게 effect를 다시 시작하지 않도록 children과 onError function을 가능하면 안정적으로 유지하세요.

목차