dehydrate 會建立一個 cache 的凍結表示,之後可以用 HydrationBoundary 或 hydrate 進行水合 (hydration)。這對於將預先取得的查詢從伺服器傳遞到客戶端,或將查詢持久化到 localStorage 或其他持久化儲存位置非常有用。預設情況下,它只包含當前成功的查詢。
import { dehydrate } from '@tanstack/react-query'
const dehydratedState = dehydrate(queryClient, {
shouldDehydrateQuery,
shouldDehydrateMutation,
})
import { dehydrate } from '@tanstack/react-query'
const dehydratedState = dehydrate(queryClient, {
shouldDehydrateQuery,
shouldDehydrateMutation,
})
選項
回傳值
某些儲存系統(例如瀏覽器的 Web Storage API)要求值必須是 JSON 可序列化的。如果你需要脫水無法自動序列化為 JSON 的值(如 Error 或 undefined),則必須自行序列化。由於預設只包含成功的查詢,若要同時包含 Errors,你需要提供 shouldDehydrateQuery,例如:
// 伺服器端
const state = dehydrate(client, { shouldDehydrateQuery: () => true }) // 同時包含 Errors
const serializedState = mySerialize(state) // 將 Error 實例轉換為物件
// 客戶端
const state = myDeserialize(serializedState) // 將物件轉換回 Error 實例
hydrate(client, state)
// 伺服器端
const state = dehydrate(client, { shouldDehydrateQuery: () => true }) // 同時包含 Errors
const serializedState = mySerialize(state) // 將 Error 實例轉換為物件
// 客戶端
const state = myDeserialize(serializedState) // 將物件轉換回 Error 實例
hydrate(client, state)
hydrate 將先前脫水的狀態加入 cache 中。
import { hydrate } from '@tanstack/react-query'
hydrate(queryClient, dehydratedState, options)
import { hydrate } from '@tanstack/react-query'
hydrate(queryClient, dehydratedState, options)
選項
如果你嘗試水合的查詢已經存在於 queryCache 中,hydrate 只會在資料比快取中的資料更新時覆寫它們。否則,水合不會生效。
HydrationBoundary 將先前脫水的狀態加入到由 useQueryClient() 回傳的 queryClient 中。如果客戶端已包含資料,新查詢會根據更新時間戳記智能合併。
import { HydrationBoundary } from '@tanstack/react-query'
function App() {
return <HydrationBoundary state={dehydratedState}>...</HydrationBoundary>
}
import { HydrationBoundary } from '@tanstack/react-query'
function App() {
return <HydrationBoundary state={dehydratedState}>...</HydrationBoundary>
}
注意:只有 queries 可以用 HydrationBoundary 進行脫水
選項