用途
本技能用于在 TanStack Query 中通过预取(prefetch)来消除请求瀑布(request waterfall),让数据在组件真正需要之前就开始加载,从而减少串行等待。它围绕 prefetchQuery、prefetchInfiniteQuery、ensureQueryData、fetchQuery、usePrefetchQuery、usePrefetchInfiniteQuery 等方法展开,说明何时该用哪一个。
主要能力
- 用 queryOptions 定义可复用的查询配置(queryKey、queryFn、staleTime 等),供预取和实际查询共享。
- 用 queryClient.prefetchQuery 预热缓存,适合只需要“暖缓存”的场景。
- 用 queryClient.ensureQueryData 在路由 loader 中加载路由关键数据。
- 用 usePrefetchQuery 在 Suspense 挂起之前完成预取。
- 用 queryClient.fetchQuery 在调用方需要数据或需要抛出错误时使用。
使用方式
基础设置:创建 QueryClient,并用 queryOptions 定义查询配置,例如 todosOptions 包含 queryKey、queryFn 和 staleTime,然后通过 queryClient.prefetchQuery(todosOptions) 预取。
路由关键数据:在 loader 中使用 ensureQueryData,例如 contactLoader 调用 queryClient.ensureQueryData(contactOptions(contactId))。
Suspense 前预取:在 Suspense 边界之外调用 usePrefetchQuery(commentsOptions),再在 Suspense 内用 useSuspenseQuery 读取同一配置,避免挂起后才开始加载。
选择正确的客户端方法:当调用方需要数据或需要抛出错误时用 fetchQuery;当只需要预热缓存时用 prefetchQuery。
常见错误
- 误以为 prefetchQuery 会返回数据:prefetchQuery 返回 void 并吞掉错误;需要数据或错误时应使用 fetchQuery。
- 只在预取时设置 staleTime:预取调用的选项不会自动配置后续的 observer,应把配置抽成 queryOptions 并同时用于预取和 useQuery。
- 在 Suspense 挂起之后才预取:effect 不会在 suspenseful 查询解析之前运行,因此无法消除该瀑布,应在 Suspense 边界外使用 usePrefetchQuery。
适用场景
适用于使用 TanStack Query 的 React 应用,尤其是存在多级串行数据依赖、路由加载、Suspense 数据获取等需要提前加载数据的场景。
限制
资料未提供该技能对具体框架版本、运行环境或性能指标的额外说明;相关细节暂未提供。