译零 TransZero · TanStack Query 中文文档
主站

useQueries

更新于 2026-11-02 Vue 查看英文原文 ↗
TypeScript
1function useQueries<T extends any[], TCombinedResult = T extends [] ? [] : T extends [Head] ? [GetUseQueryResult<Head>] : T extends [Head, ...Tails[]] ? [...Tails[]] extends [] ? [] : [...Tails[]] extends [Head] ? [GetUseQueryResult<Head>, GetUseQueryResult<Head>] : [...Tails[]] extends [Head, ...Tails[]] ? [...Tails[]] extends [] ? [] : [...Tails[]] extends [Head] ? [GetUseQueryResult<Head>, GetUseQueryResult<Head>, GetUseQueryResult<Head>] : [...Tails[]] extends [Head, ...Tails[]] ? [...(...)[]] extends [] ? [] : ... extends ... ? ... : ... : [...{ [K in (...)]: (...) }[]] : [...{ [K in string | number | symbol]: GetUseQueryResult<Tails[K]> }[]] : { [K in string | number | symbol]: GetUseQueryResult<T[K]> }>(options: ShallowOption & object, queryClient?: QueryClient): Readonly<Ref<TCombinedResult>>;

定义于:packages/vue-query/src/useQueries.ts:354

useQueries 组合式函数可用于拉取可变数量的查询。

queries 选项接受一个查询选项对象数组,其结构与 useQuery 的选项基本相同。该数组可以是普通数组、一个 ref/响应式数组(每个条目单独追踪),或一个 getter 函数——若该数组本身(其长度,或其中包含哪些查询)依赖于其他响应式状态,请传入 getter。

若在查询对象数组中多次使用相同的查询键,可能导致部分数据在多个查询之间共享。为避免此问题,建议先对查询去重,再将结果映射回所需的结构。

combine 选项可用于将各查询的结果合并为单个值。该结果会在结构上尽可能保持引用稳定性。

placeholderData 在此处同样受支持,但与 useQuery 不同,它不会接收先前渲染的查询信息,因为每次渲染时查询数量可能不同。

类型参数

T

T extends any[]

TCombinedResult

TCombinedResult = T extends [] ? [] : T extends [Head] ? [GetUseQueryResult<Head>] : T extends [Head, ...Tails[]] ? [...Tails[]] extends [] ? [] : [...Tails[]] extends [Head] ? [GetUseQueryResult<Head>, GetUseQueryResult<Head>] : [...Tails[]] extends [Head, ...Tails[]] ? [...Tails[]] extends [] ? [] : [...Tails[]] extends [Head] ? [GetUseQueryResult<Head>, GetUseQueryResult<Head>, GetUseQueryResult<Head>] : [...Tails[]] extends [Head, ...Tails[]] ? [...(...)[]] extends [] ? [] : ... extends ... ? ... : ... : [...{ [K in (...)]: (...) }[]] : { [K in string | number | symbol]: GetUseQueryResult<Tails[K]> }[]] : { [K in string | number | symbol]: GetUseQueryResult<T[K]> }

参数

options

ShallowOption & object

要执行的 queries 数组,以及可选的 combine 和 shallow 选项。

queryClient?

QueryClient

使用此参数可指定自定义 QueryClient;否则将使用由 VueQueryPlugin 提供的 QueryClient。

返回值

Readonly<Ref<TCombinedResult>>

一个指向合并后结果的 ref。若未提供 combine,则该结果为一个数组,其元素顺序与输入数组一致,且每个元素均为对应查询的结果;若提供了 combine,则该结果即为 combine 所返回的值。

示例

HTML
1<script setup lang="ts">2import { useQueries } from '@tanstack/vue-query'34const props = defineProps<{ ids: Array<number> }>()56const postQueries = useQueries({7  queries: () =>8    props.ids.map((id) => ({9      queryKey: ['post', id],10      queryFn: () => fetchPost(id),11      staleTime: Infinity,12    })),13})14</script>15 16<template>17  <ul>18    <li v-for="(query, index) in postQueries" :key="props.ids[index]">19      <span v-if="query.isPending">Loading...</span>20      <span v-else-if="query.isError">Error: {{ query.error.message }}</span>21      <span v-else>{{ query.data.title }}</span>22    </li>23  </ul>24</template>

将结果合并为单个值:

HTML
1<script setup lang="ts">2import { useQueries } from '@tanstack/vue-query'34const props = defineProps<{ ids: Array<number> }>()56const combined = useQueries({7  queries: () =>8    props.ids.map((id) => ({9      queryKey: ['post', id],10      queryFn: () => fetchPost(id),11    })),12  combine: (postQueries) => ({13    data: postQueries.map((query) => query.data),14    isPending: postQueries.some((query) => query.isPending),15    isError: postQueries.some((query) => query.isError),16  }),17})18</script>19 20<template>21  <span v-if="combined.isPending">Loading...</span>22  <span v-else-if="combined.isError">Error!</span>23  <ul v-else>24    <li v-for="post in combined.data" :key="post.id">{{ post.title }}</li>25  </ul>26</template>

通过 queryOptions 对 select 进行类型标注。注意:直接展开 queryOptions 的结果并在内联中覆盖 select,仍将回退至 unknown —— 应再次将展开操作包裹在 queryOptions 中,以确保覆盖项在传入 useQueries 前即被解析:

HTML
1<script setup lang="ts">2import { queryOptions, useQueries } from '@tanstack/vue-query'34const props = defineProps<{ id: number }>()56const postOptions = (id: number) =>7  queryOptions({8    queryKey: ['post', id],9    queryFn: () => fetchPost(id),10  })1112const [{ data: broken }] = useQueries({13  queries: () => [14    {15      ...postOptions(props.id),16      // ❌ `data` is `unknown` here17      select: (data) => data.title,18    },19  ],20})2122const [{ data: fixed }] = useQueries({23  queries: () => [24    queryOptions({25      ...postOptions(props.id),26      // ✅ `data` is `Post`27      select: (data) => data.title,28    }),29  ],30})31</script>32 33<template>34  <h1>{{ fixed }}</h1>35</template>

本页为 TanStack Query 文档(Vue 版)的非官方中文翻译,原文由上游团队维护,遵循 MIT 许可。 译文如有偏差,以英文原文为准。

译自上游 59d11de