Suspense
Suspense is currently an experimental feature of React. These APIs may change significantly and without a warning before they become a part of React.
You can enable the suspense
option to use SWR with React Suspense:
import { Suspense } from 'react'
import useSWR from 'swr'
function Profile() {
const { data } = useSWR('/api/user', fetcher, { suspense: true })
return <div>hello, {data.name}</div>
}
function App() {
return (
<Suspense fallback={<div>loading...</div>}>
<Profile />
</Suspense>
)
}
Note that the suspense
option is not allowed to change in the lifecycle.
In Suspense mode, data
is always the fetch response (so you don’t need to
check if it’s undefined
). But if an error occurred, you need to use an
error boundary
to catch it:
<ErrorBoundary fallback={<h2>Could not fetch posts.</h2>}>
<Suspense fallback={<h1>Loading posts...</h1>}>
<Profile />
</Suspense>
</ErrorBoundary>
Note: With Conditional Fetching
Normally, when you enabled suspense
it’s guaranteed that data
will always be
ready on render:
function Profile() {
const { data } = useSWR('/api/user', fetcher, { suspense: true })
// `data` will never be `undefined`
}
However, when using it together with conditional fetching or dependent fetching,
data
will be undefined
if the request is paused:
function Profile() {
const { data } = useSWR(isReady ? '/api/user' : null, fetcher, {
suspense: true
})
// `data` will be `undefined` if `isReady` is false
}
If you want to read more technical details about this restriction, check the discussion here.