前端
PythonJava运维数据库
TanStack Query
TanStack Query
  • getting started
    • 快速开始
    • 开发工具
    • Typescript
    • 默认配置
    • 网络模式
  • Query
    • 查询
    • 查询键
    • 查询函数
    • 查询选项
    • 并行查询
    • 有依赖的查询
    • 查询状态指示器
    • 窗口聚焦重新获取数据
    • 禁用/暂停查询
    • 查询重试
    • 分页查询
    • 无限查询
    • 初始化查询数据
  • 占位符
  • Mutation
    • 修改 Mutations
    • 主动查询失效 Query Invalidation
    • 修改导致的失效 Invalidation From Mutations
    • 通过修改的数据更新查询内容
    • 乐观更新
  • 取消查询
  • 默认查询函数
  • 过滤器
  • Suspense
  • 缓存数据
  • Api Reference
    • QueryClient
    • QueryCache
    • MutationCache
    • QueryObserver QueriesObserver
    • InfiniteQueryObserver
    • FocusManager
    • NotifyManager
    • useQuery
    • useQueries useInfiniteQuery
    • useMutation
    • useIsFetching
    • useIsMutating
    • useMutationState
    • useSuspenseQuery
    • useSuspenseInfiniteQuery
    • useSuspenseQueries
    • QueryClientProvider
    • useQueryClient
    • queryOptions
    • infiniteQueryOptions
    • QueryErrorResetBoundary
    • useQueryErrorResetBoundary
    • hydration
由 GitBook 提供支持
在本页
  • useQuery 依赖查询
  • useQueries 依赖查询
  • 性能注意事项

这有帮助吗?

  1. Query

有依赖的查询

依赖查询依赖于先前的查询,要实现这一点,需要使用enable选项来告诉查询何时执行:

useQuery 依赖查询

依赖查询(或串行查询)依赖于前一个查询的完成,才能执行。要实现这一点,简单的方法是使用enabled选项来告诉查询何时准备好运行:

// 获取用户
const { data: user } = useQuery({
  queryKey: ["user", email],
  queryFn: getUserByEmail
});

const userId = user?.id;

// 然后获取用户的项目
const {
  status,
  fetchStatus,
  data: projects
} = useQuery({
  queryKey: ["projects", userId],
  queryFn: getProjectsByUser,
  // 在 userId 存在之前,查询不会执行
  enabled: !!userId
});
在查询开始时,projects 查询的状态是:
status: 'pending'
isPending: true
fetchStatus: 'idle'

一旦用户数据可用,projects 查询将启用,状态变为:
status: 'pending'
isPending: true
fetchStatus: 'fetching'

一旦获取到项目,状态将变为:
status: 'success'
isPending: false
fetchStatus: 'idle'

useQueries 依赖查询

动态并行查询——useQueries也可以依赖于先前的查询,以下是如何实现的:

// 获取用户ID
const { data: userIds } = useQuery({
  queryKey: ["users"],
  queryFn: getUsersData,
  select: (users) => users.map((user) => user.id)
});

// 然后获取用户的消息
const usersMessages = useQueries({
  queries: userIds
    ? userIds.map((id) => {
        return {
          queryKey: ["messages", id],
          queryFn: () => getMessagesByUsers(id)
        };
      })
    : [] // 如果 users 为 undefined,则返回空数组
});

性能注意事项

依赖查询本质上形成了请求瀑布效应,这会影响性能。假设两个查询所需时间相同,那么串行执行它们的时间总是会是并行执行的两倍,这对于高延迟的客户端尤为不利。如果可能,最好重新设计后端 API,使得两个查询能够并行获取,尽管这在实际操作中并不总是可行的。

在上面的例子中,除了先获取 getUserByEmail 才能获取 getProjectsByUser,引入一个新的 getProjectsByUserEmail 查询将会扁平化这个瀑布。

上一页并行查询下一页查询状态指示器

最后更新于2个月前

这有帮助吗?