createQuery
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
调用签名
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 之间共享这些选项。
示例
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}调用签名
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 之间共享这些选项。
示例
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:
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 被设置后才启用:
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:
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,其计时起点是列表被拉取的时间,而非当前时刻:
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}分页数据,在加载下一页时保持上一页数据可见:
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}