跳到內容
文件
Suspense

Suspense

🚨

React 仍然不建議在 SWR 等資料框架中使用 Suspense更多資訊)。這些 API 可能會因為我們的研究結果而在未來有所變更。

您可以啟用 suspense 選項,以將 SWR 與 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>
  )
}
💡

請注意,suspense 選項在生命週期中不允許變更。

在 Suspense 模式中,data 永遠是 fetch 回應(因此您不需要檢查它是否為 undefined)。但如果發生錯誤,您需要使用錯誤邊界(在新分頁中開啟)來捕獲它

<ErrorBoundary fallback={<h2>Could not fetch posts.</h2>}>
  <Suspense fallback={<h1>Loading posts...</h1>}>
    <Profile />
  </Suspense>
</ErrorBoundary>
💡

Suspense 模式會暫停渲染,直到資料準備就緒,這表示它很容易造成瀑布問題。為了避免這種情況,您應該在渲染之前預先獲取資源。更多資訊


注意:搭配條件式獲取

一般來說,當您啟用 suspense 時,保證 data 將永遠在渲染時準備就緒

function Profile () {
  const { data } = useSWR('/api/user', fetcher, { suspense: true })
 
  // `data` will never be `undefined`
  // ...
}

但是,當與條件式獲取或相依獲取一起使用時,如果請求被暫停data 將會是 undefined

function Profile () {
  const { data } = useSWR(isReady ? '/api/user' : null, fetcher, { suspense: true })
 
  // `data` will be `undefined` if `isReady` is false
  // ...
}

如果您想閱讀更多關於此限制的技術細節,請查看此處的討論(在新分頁中開啟)

伺服器端渲染

在伺服器端使用 suspense 模式時(包括在 Next.js 中進行預先渲染),必須透過 fallbackData 或 fallback 提供初始資料。這表示您不能使用 Suspense 在伺服器端獲取資料,而是進行完全的用戶端資料獲取,或是透過框架級別的資料獲取方法(例如 Next.js 中的 getStaticProps)來獲取資料。更多的討論可以在這裡(在新分頁中開啟)找到。