<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.