dehydrate 会创建一个 cache 的冻结表示,后续可通过 HydrationBoundary 或 hydrate 进行水合。这在将预取查询从服务端传递到客户端,或将查询持久化到 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 进行脱水
选项