<Suspense> β Defer Rendering Until ReadyWraps components that may suspend, showing a fallback UI while waiting.
<Suspense fallback={<p>Loading...</p>}>
<SomeComponent />
</Suspense>
React.lazy()use(promise)await in async components (Client side)| Feature | Suspends? | Requires <Suspense>? |
|---|---|---|
React.lazy() |
β Yes | β Yes |
use(promise) |
β Yes | β Yes |
use(context) |
β No | β No |
| SSR/RSC + async | β Yes | β (Client hydration) |
const Chart = lazy(() => import('./Chart'));
function Page() {
return (
<Suspense fallback={<p>Loading chart...</p>}>
<Chart />
</Suspense>
);
}
use()function Message({ promise }) {
const data = use(promise);
return <p>{data}</p>;
}
<Suspense fallback={<p>Loading message...</p>}>
<Message promise={fetchMessage()} />
</Suspense>
<Suspense fallback={<Spinner />}>
<ComponentA />
<Suspense fallback={<Skeleton />}>
<ComponentB />
</Suspense>
</Suspense>
Each nested <Suspense> handles its own loading boundaries independently.