-
Notifications
You must be signed in to change notification settings - Fork 7.9k
[Suspense] Document what activates a boundary, with live examples #8505
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
0f92fef
4ddc1e3
021f94d
14e8f67
d34d3ce
2e01ae7
f6d28e6
16fa091
54958a7
6f6185d
b7c2094
201b5e3
d2df82a
b33c637
9091bee
9be6345
025ee7a
2dfe10f
567cdd4
c45c9b0
1ed5be2
3eb0f38
dd5449e
d63cade
d56099a
2942718
551cdf6
0d41392
5cc4a30
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -203,17 +203,25 @@ async function getAlbums() { | |
|
|
||
| </Sandpack> | ||
|
|
||
| <Note> | ||
| --- | ||
|
|
||
| ### What activates a Suspense boundary {/*what-activates-a-suspense-boundary*/} | ||
|
|
||
| **Only Suspense-enabled data sources will activate the Suspense component.** They include: | ||
| A Suspense boundary displays its `fallback` while its content is loading, and it can also wait on other resources before revealing that content. The following activate a boundary: | ||
|
eps1lon marked this conversation as resolved.
Outdated
|
||
|
|
||
| - Data fetching with Suspense-enabled frameworks like [Relay](https://relay.dev/docs/guided-tour/rendering/loading-states/) and [Next.js](https://nextjs.org/docs/app/building-your-application/routing/loading-ui-and-streaming#streaming-with-suspense) | ||
| - Lazy-loading component code with [`lazy`](/reference/react/lazy) | ||
| - Reading the value of a cached Promise with [`use`](/reference/react/use) | ||
| - Lazy-loading component code with [`lazy`](/reference/react/lazy). | ||
| - Reading a Promise with [`use`](/reference/react/use), including data streamed from [Server Components](/reference/rsc/server-components) and integrations from frameworks like [Relay](https://relay.dev/docs/guided-tour/rendering/loading-states/). | ||
| - Loading a stylesheet rendered with [`<link rel="stylesheet">` and a `precedence` prop.](/reference/react-dom/components/link#special-rendering-behavior) React blocks the boundary until the stylesheet loads, up to a timeout. | ||
| - Loading fonts. React blocks a streamed boundary until [`document.fonts.ready`](https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet/ready) resolves, up to a timeout. Fonts also block a [`<ViewTransition>`](/reference/react/ViewTransition) update. | ||
|
aurorascharff marked this conversation as resolved.
Outdated
|
||
| - Streaming a large boundary's HTML during server rendering. React reveals the content as the HTML arrives. | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The other examples are probably self-explanatory. This one could do with an example. Examples for all would be nice with a side-by-side with a Suspense implementation that wouldn't block (e.g. with just some simple DOM operations).
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. How about with effect as an example? It's a common confusion
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That's for
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I see. I must have misunderstood. I'm wondering if the example you are referring to is too low level for the suspense page, but would fit nicely in the prerender or resume docs. I also think keeping this current example is quite a nice way to show this common misconception. I've added now a link to those docs here, we can add the example on that page? 201b5e3 possibly in a follow-up PR
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's any SSR API with support for streaming. The whole point for me was to explain Suspense in a single place. It isn't low-level because it explains how React thinks about Suspense.
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. oh, gotcha, will add!
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So I simplified my example. Still open to removing the whole use affecting if we don't think it's necessary, and then I added your example. |
||
| - Loading an image, where `img.src` blocks the boundary until the source loads. This behavior is not enabled by default. An `<img onLoad>` handler opts out, and images in a [`<ViewTransition>`](/reference/react/ViewTransition) update opt in automatically. | ||
|
aurorascharff marked this conversation as resolved.
Outdated
|
||
| - <ExperimentalBadge /> Performing CPU-bound render work inside a `<Suspense>` boundary marked with the `defer` prop. | ||
|
|
||
| <Note> | ||
|
|
||
| Suspense **does not** detect when data is fetched inside an Effect or event handler. | ||
|
|
||
| The exact way you would load data in the `Albums` component above depends on your framework. If you use a Suspense-enabled framework, you'll find the details in its data fetching documentation. | ||
| The exact way you would load data in the `Albums` component above depends on your framework. If you use a framework with built-in Suspense support, you'll find the details in its data fetching documentation. | ||
|
|
||
| Suspense-enabled data fetching without the use of an opinionated framework is not yet supported. The requirements for implementing a Suspense-enabled data source are unstable and undocumented. An official API for integrating data sources with Suspense will be released in a future version of React. | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This line is out of date because of yours and @rickhanlonii great work on the use() docs.
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nice catch!!! Updating! |
||
|
|
||
|
|
||

Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Very excited to see these being called out and updated!
My understanding is that a "suspense enabled framework" is a framework that wraps these features that activates a suspense boundaries . If that is true could we specifically call it out what suspense enabled means?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe this? 021f94d