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

createQuery

更新于 2026-11-02 Solid 查看英文原文 ↗
TypeScript
1const createQuery: {2<TQueryFnData, TError, TData, TQueryKey>  (options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>, queryClient?: () => QueryClient): DefinedUseQueryResult<TData, TError>;3<TQueryFnData, TError, TData, TQueryKey>  (options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>, queryClient?: () => QueryClient): UseQueryResult<TData, TError>;4} = useQuery;

定义于:packages/solid-query/src/index.ts:57

调用签名

TypeScript
1<TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryKey extends readonly unknown[] = readonly unknown[]>(options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>, queryClient?: () => QueryClient): DefinedUseQueryResult<TData, TError>;

订阅一个查询:即对一个与唯一查询键(query key)绑定的异步数据源所作的声明式依赖。
当选项要求时,该查询才会执行——enabled: false 会跳过初始拉取(fetch)。

此重载在 initialData 已知被定义时被选用,因此返回的 data 永远不会是 undefined(除非某个 select 将 TData 更改为包含 undefined)。

类型参数

TQueryFnData

TQueryFnData = unknown

TError

TError = Error

TData

TData = TQueryFnData

TQueryKey

TQueryKey extends readonly unknown[] = readonly unknown[]

参数

options

DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>

一个返回 DefinedInitialDataOptions 的访问器(accessor)——即你可传给 useQuery 的全部选项,且其中 initialData 已知被定义。

queryClient?

() => QueryClient

一个返回自定义 QueryClient 的访问器。否则将使用最近上下文中的 QueryClient。

返回值

DefinedUseQueryResult<TData, TError>

当前查询结果,以 Solid store 形式返回,并经类型约束,使得 status 为 success;若拉取失败但保留已有数据,则为 error(在此重载的类型中,status 永远不会解析为 pending,因为 initialData 保证了初始数据的存在)。isSuccess/isError 是为方便起见推导出的布尔值。

参见

使用 queryOptions 在 useQuery 和 queryClient.query 等命令式 API 之间共享这些选项。

示例

TypeScript
1import { For } from 'solid-js'2import { useQuery } from '@tanstack/solid-query'3 4function Posts() {5  // `postsQuery.data` is never `undefined`, thanks to `initialData` — even if a refetch fails, so the6  // list stays visible alongside the error.7  const postsQuery = useQuery(() => ({8    queryKey: ['posts'],9    queryFn: fetchPosts,10    initialData: [],11  }))12 13  return (14    <div>15      {postsQuery.isError ? <span>Error: {postsQuery.error.message}</span> : null}16      <ul>17        <For each={postsQuery.data}>{(post) => <li>{post.title}</li>}</For>18      </ul>19    </div>20  )21}

调用签名

TypeScript
1<TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryKey extends readonly unknown[] = readonly unknown[]>(options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>, queryClient?: () => QueryClient): UseQueryResult<TData, TError>;

订阅一个查询:即对一个与唯一查询键(query key)绑定的异步数据源所作的声明式依赖。
当选项要求时,该查询才会执行——enabled: false 会跳过初始拉取(fetch)。

类型参数

TQueryFnData

TQueryFnData = unknown

TError

TError = Error

TData

TData = TQueryFnData

TQueryKey

TQueryKey extends readonly unknown[] = readonly unknown[]

参数

options

UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>

一个返回 UndefinedInitialDataOptions 的访问器(accessor)——即你可传给 useQuery 的全部选项。

queryClient?

() => QueryClient

一个返回自定义 QueryClient 的访问器。否则将使用最近上下文中的 QueryClient。

返回值

UseQueryResult<TData, TError>

当前查询结果,以 Solid store 形式返回。status 在无缓存数据可供显示时为 pending,上一次拉取失败时为 error,有数据可供显示时为 success。isPending/isSuccess/isError 是为方便起见推导出的布尔值。

参见

使用 queryOptions 在 useQuery 和 queryClient.query 等命令式 API 之间共享这些选项。

示例

TypeScript
1import { For, Match, Switch } from 'solid-js'2import { useQuery } from '@tanstack/solid-query'3 4function Posts() {5  const postsQuery = useQuery(() => ({6    queryKey: ['posts'],7    queryFn: fetchPosts,8  }))9 10  return (11    <Switch>12      <Match when={postsQuery.isPending}>Loading...</Match>13      <Match when={postsQuery.isError}>Error: {postsQuery.error.message}</Match>14      <Match when={postsQuery.isSuccess}>15        <ul>16          <For each={postsQuery.data}>{(post) => <li>{post.title}</li>}</For>17        </ul>18        <div>{postsQuery.isFetching ? 'Background Updating...' : ' '}</div>19      </Match>20    </Switch>21  )22}

select 从缓存值中派生组件所需的 data,而不会改变缓存中实际存储的内容——缓存仍保存完整的 Post[],但此处的 data 是一个 number:

TypeScript
1import { Match, Switch } from 'solid-js'2import { useQuery } from '@tanstack/solid-query'3 4function PostCount() {5  const postsQuery = useQuery(() => ({6    queryKey: ['posts'],7    queryFn: fetchPosts,8    select: (posts) => posts.length,9  }))10 11  return (12    <Switch>13      <Match when={postsQuery.isPending}>Loading...</Match>14      <Match when={postsQuery.isError}>Error: {postsQuery.error.message}</Match>15      <Match when={postsQuery.isSuccess}>{postsQuery.data} posts</Match>16    </Switch>17  )18}

一个依赖型查询,仅在 postId 被设置后才启用:

TypeScript
1import { Match, Switch } from 'solid-js'2import { useQuery } from '@tanstack/solid-query'3 4function Post(props: { postId: number | undefined }) {5  const postQuery = useQuery(() => ({6    queryKey: ['post', props.postId],7    queryFn: () => fetchPost(props.postId!),8    enabled: props.postId != null,9  }))10 11  return (12    <Switch fallback={<h1>{postQuery.data?.title}</h1>}>13      <Match when={props.postId == null}>Select a post</Match>14      <Match when={postQuery.isLoading}>Loading...</Match>15      <Match when={postQuery.isError}>Error: {postQuery.error.message}</Match>16    </Switch>17  )18}

同一依赖型查询,改用 skipToken 以类型安全方式禁用,而非依赖 enabled。非空断言(non-null assertion)仍需保留——Solid 的 props 类型收窄无法在 queryFn 闭包中延续(不像局部 const 那样),但 skipToken 可确保 queryFn 的返回类型准确,无需该断言。refetch 在 queryFn 为 skipToken 时不生效——如需手动触发查询,请改用 enabled: false:

TypeScript
1import { Match, Switch } from 'solid-js'2import { skipToken, useQuery } from '@tanstack/solid-query'3 4function Post(props: { postId: number | undefined }) {5  const postQuery = useQuery(() => ({6    queryKey: ['post', props.postId],7    queryFn: props.postId != null ? () => fetchPost(props.postId!) : skipToken,8  }))9 10  return (11    <Switch fallback={<h1>{postQuery.data?.title}</h1>}>12      <Match when={props.postId == null}>Select a post</Match>13      <Match when={postQuery.isLoading}>Loading...</Match>14      <Match when={postQuery.isError}>Error: {postQuery.error.message}</Match>15    </Switch>16  )17}

从已缓存的列表中预填充详情查询,从而跳过加载状态。initialDataUpdatedAt 继承列表自身的拉取时间,因此若设置了 staleTime,其计时起点是列表被拉取的时间,而非当前时刻:

TypeScript
1import { useQuery, useQueryClient } from '@tanstack/solid-query'2 3function Post(props: { postId: number }) {4  const queryClient = useQueryClient()5 6  const postQuery = useQuery(() => ({7    queryKey: ['post', props.postId],8    queryFn: () => fetchPost(props.postId),9    initialData: () =>10      queryClient11        .getQueryData<Array<Post>>(['posts'])12        ?.find((post) => post.id === props.postId),13    initialDataUpdatedAt: () =>14      queryClient.getQueryState(['posts'])?.dataUpdatedAt,15  }))16 17  return postQuery.isError ? <span>Error: {postQuery.error.message}</span> : <h1>{postQuery.data?.title}</h1>18}

分页数据,在加载下一页时保持上一页数据可见:

TypeScript
1import { For, createSignal } from 'solid-js'2import { keepPreviousData, useQuery } from '@tanstack/solid-query'3 4function Posts() {5  const [page, setPage] = createSignal(0)6 7  const postsQuery = useQuery(() => ({8    queryKey: ['posts', page()],9    queryFn: () => fetchPosts(page()),10    placeholderData: keepPreviousData,11  }))12 13  return (14    <div>15      <ul>16        <For each={postsQuery.data}>{(post) => <li>{post.title}</li>}</For>17      </ul>18      <button19        disabled={postsQuery.isPlaceholderData}20        onClick={() => setPage((old) => old + 1)}21      >22        Next Page23      </button>24    </div>25  )26}

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

译自上游 59d11de