createInfiniteQuery
概述
1function createInfiniteQuery<TQueryFnData = unknown, TError = Error, TData = InfiniteData<TQueryFnData, unknown>, TQueryKey extends readonly unknown[] = readonly unknown[], TPageParam = unknown>(options: Accessor<DefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>>, queryClient?: Accessor<QueryClient>): DefinedCreateInfiniteQueryResult<TData, TError>;2function createInfiniteQuery<TQueryFnData = unknown, TError = Error, TData = InfiniteData<TQueryFnData, unknown>, TQueryKey extends readonly unknown[] = readonly unknown[], TPageParam = unknown>(options: Accessor<UndefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>>, queryClient?: Accessor<QueryClient>): CreateInfiniteQueryResult<TData, TError>;3function createInfiniteQuery<TQueryFnData, TError = Error, TData = InfiniteData<TQueryFnData, unknown>, TQueryKey extends readonly unknown[] = readonly unknown[], TPageParam = unknown>(options: Accessor<CreateInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>>, queryClient?: Accessor<QueryClient>): CreateInfiniteQueryResult<TData, TError>;DefinedInitialDataInfiniteOptions→DefinedCreateInfiniteQueryResult:createInfiniteQuery的选项与createQuery完全相同,额外增加了initialPageParam、getNextPageParam、getPreviousPageParam和maxPages。UndefinedInitialDataInfiniteOptions→CreateInfiniteQueryResult:createInfiniteQuery的选项与createQuery完全相同,额外增加了initialPageParam、getNextPageParam、getPreviousPageParam和maxPages。CreateInfiniteQueryOptions→CreateInfiniteQueryResult:createInfiniteQuery的选项与createQuery完全相同,额外增加了initialPageParam、getNextPageParam、getPreviousPageParam和maxPages。
调用签名
1function createInfiniteQuery<TQueryFnData = unknown, TError = Error, TData = InfiniteData<TQueryFnData, unknown>, TQueryKey extends readonly unknown[] = readonly unknown[], TPageParam = unknown>(options: Accessor<DefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>>, queryClient?: Accessor<QueryClient>): DefinedCreateInfiniteQueryResult<TData, TError>;定义于:packages/svelte-query/src/createInfiniteQuery.ts:36
createInfiniteQuery 的选项与 createQuery 完全相同,额外增加了 initialPageParam、getNextPageParam、getPreviousPageParam 和 maxPages。
当 initialData 已知为已定义时,将选择此重载。
类型参数
TQueryFnData
TQueryFnData = unknown
TError
TError = Error
TData
TData = InfiniteData<TQueryFnData, unknown>
TQueryKey
TQueryKey extends readonly unknown[] = readonly unknown[]
TPageParam
TPageParam = unknown
参数
options
Accessor<DefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>>
要使用的 DefinedInitialDataInfiniteOptions —— 即可传给 createInfiniteQuery 的全部内容(其中 initialData 已知为已定义),并包裹在 Accessor 中,以支持响应式更新。
queryClient?
使用此参数可指定自定义 QueryClient;否则将使用最近上下文中的 QueryClient。
返回值
DefinedCreateInfiniteQueryResult<TData, TError>
当前查询结果,以及用于分页的 fetchNextPage/fetchPreviousPage/hasNextPage/hasPreviousPage。
参阅
infiniteQueryOptions:在 createInfiniteQuery 与 queryClient.infiniteQuery 等命令式 API 之间共享这些选项。
调用签名
1function createInfiniteQuery<TQueryFnData = unknown, TError = Error, TData = InfiniteData<TQueryFnData, unknown>, TQueryKey extends readonly unknown[] = readonly unknown[], TPageParam = unknown>(options: Accessor<UndefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>>, queryClient?: Accessor<QueryClient>): CreateInfiniteQueryResult<TData, TError>;定义于:packages/svelte-query/src/createInfiniteQuery.ts:70
createInfiniteQuery 的选项与 createQuery 完全相同,额外增加了 initialPageParam、getNextPageParam、getPreviousPageParam 和 maxPages。
当 initialData 被省略、可能为 undefined,或是一个可能返回 undefined 的函数时,将选择此重载。
类型参数
TQueryFnData
TQueryFnData = unknown
TError
TError = Error
TData
TData = InfiniteData<TQueryFnData, unknown>
TQueryKey
TQueryKey extends readonly unknown[] = readonly unknown[]
TPageParam
TPageParam = unknown
参数
options
Accessor<UndefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>>
要使用的 UndefinedInitialDataInfiniteOptions —— 即可传给 createInfiniteQuery 的全部内容,并包裹在 Accessor 中,以支持响应式更新。
queryClient?
使用此参数可指定自定义 QueryClient;否则将使用最近上下文中的 QueryClient。
返回值
CreateInfiniteQueryResult<TData, TError>
当前查询结果,以及用于分页的 fetchNextPage/fetchPreviousPage/hasNextPage/hasPreviousPage。
参阅
infiniteQueryOptions:在 createInfiniteQuery 与 queryClient.infiniteQuery 等命令式 API 之间共享这些选项。
调用签名
1function createInfiniteQuery<TQueryFnData, TError = Error, TData = InfiniteData<TQueryFnData, unknown>, TQueryKey extends readonly unknown[] = readonly unknown[], TPageParam = unknown>(options: Accessor<CreateInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>>, queryClient?: Accessor<QueryClient>): CreateInfiniteQueryResult<TData, TError>;定义于:packages/svelte-query/src/createInfiniteQuery.ts:182
createInfiniteQuery 的选项与 createQuery 完全相同,额外增加了 initialPageParam、getNextPageParam、getPreviousPageParam 和 maxPages。
类型参数
TQueryFnData
TQueryFnData
TError
TError = Error
TData
TData = InfiniteData<TQueryFnData, unknown>
TQueryKey
TQueryKey extends readonly unknown[] = readonly unknown[]
TPageParam
TPageParam = unknown
参数
options
Accessor<CreateInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>>
要使用的 CreateInfiniteQueryOptions —— 即可传给 createInfiniteQuery 的全部内容,并包裹在 Accessor 中,以支持响应式更新。
queryClient?
使用此参数可指定自定义 QueryClient;否则将使用最近上下文中的 QueryClient。
返回值
CreateInfiniteQueryResult<TData, TError>
当前查询结果,以及用于分页的 fetchNextPage/fetchPreviousPage/hasNextPage/hasPreviousPage。
参阅
infiniteQueryOptions:在 createInfiniteQuery 与 queryClient.infiniteQuery 等命令式 API 之间共享这些选项。
示例
通过点击“加载更多”按钮获取下一页:
1<script lang="ts">2 import { createInfiniteQuery } from '@tanstack/svelte-query'3 4 const query = createInfiniteQuery(() => ({5 queryKey: ['projects'],6 queryFn: ({ pageParam }) => fetchProjects(pageParam),7 initialPageParam: 0,8 getNextPageParam: (lastPage) => lastPage.nextId,9 }))10</script>11 12{#if query.isPending}13 Loading...14{:else if query.isError}15 <span>Error: {query.error.message}</span>16{:else}17 <ul>18 {#each query.data.pages as page}19 {#each page.projects as project (project.id)}20 <li>{project.name}</li>21 {/each}22 {/each}23 </ul>24 <button25 onclick={() => query.fetchNextPage()}26 disabled={!query.hasNextPage || query.isFetching}27 >28 {query.isFetchingNextPage29 ? 'Loading more...'30 : query.hasNextPage31 ? 'Load More'32 : 'Nothing more to load'}33 </button>34{/if}使用 IntersectionObserver 在列表末尾的哨兵元素上,实现用户滚动时自动获取下一页:
1<script lang="ts">2 import { createInfiniteQuery } from '@tanstack/svelte-query'3 4 const query = createInfiniteQuery(() => ({5 queryKey: ['projects'],6 queryFn: ({ pageParam }) => fetchProjects(pageParam),7 initialPageParam: 0,8 getNextPageParam: (lastPage) => lastPage.nextId,9 }))10 11 let sentinel: HTMLDivElement | undefined = $state()12 13 $effect(() => {14 if (sentinel == null || !query.hasNextPage || query.isFetching) return15 16 const observer = new IntersectionObserver(([entry]) => {17 if (entry?.isIntersecting) query.fetchNextPage()18 })19 observer.observe(sentinel)20 21 return () => observer.disconnect()22 })23</script>24 25{#if query.isPending}26 Loading...27{:else if query.isError}28 <span>Error: {query.error.message}</span>29{:else}30 <ul>31 {#each query.data.pages as page}32 {#each page.projects as project (project.id)}33 <li>{project.name}</li>34 {/each}35 {/each}36 </ul>37 <div bind:this={sentinel}></div>38{/if}参数
options
Accessor<CreateInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>>
要使用的 CreateInfiniteQueryOptions —— 即可传给 createInfiniteQuery 的全部内容,并包裹在 Accessor 中,以支持响应式更新。
options 属性
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
enabled? |
| false | true | ((query: Query<TQueryFnData, TError, InfiniteData<TQueryFnData, TPageParam>, TQueryKey>) => boolean) |
true |
将此选项设为 false 或返回 false 的函数,可禁用查询挂载或查询键变更时的自动重新拉取。如需重新拉取查询,请使用 refetch 方法(该方法由 useQuery 实例返回)。接受布尔值或返回布尔值的函数。 |
gcTime? |
number |
undefined |
未使用/非活跃缓存数据在内存中保留的毫秒数。当某个查询的缓存变为未使用或非活跃状态后,该缓存数据将在经过此持续时间后被垃圾回收。若指定了多个垃圾回收时间,则采用最长的那个。设为 Infinity 将禁用垃圾回收。默认值为 5 * 60 * 1000(5 分钟),服务端渲染(SSR)期间则为 Infinity。注意:受 setTimeout 的 32 位有符号整数延迟限制,最大允许时间为约 24 天——参见 timeoutManager.setTimeoutProvider 获取变通方案。 |
queryFn? |
| InfiniteData<TQueryFnData, TPageParam> | ((previousData: | InfiniteData<TQueryFnData, TPageParam> | undefined, previousQuery: | Query<InfiniteData<TQueryFnData, TPageParam>, TError, InfiniteData<TQueryFnData, TPageParam>, TQueryKey> | undefined) => | InfiniteData<TQueryFnData, TPageParam> | undefined) |
undefined |
若设置此值,它将作为该查询观察者在查询仍处于 loading 数据状态且未提供 initialData 时所使用的占位数据。 |
queryFn? |
| typeof skipToken | ((context: QueryFunctionContext<TQueryKey, TPageParam>) => TQueryFnData | Promise<TQueryFnData>) |
undefined |
查询用于请求数据的函数。除非已通过 queryClient.setQueryDefaults 或 queryClient.setDefaultOptions 设置了默认查询函数,否则此选项为必需项。接收一个 QueryFunctionContext。必须返回一个 Promise,该 Promise 要么解析出数据,要么抛出错误。数据不能为 undefined。 |
queryHash? |
string |
undefined |
queryKey 的哈希形式,使用 queryKeyHashFn(或默认哈希函数)计算得出。该值在内部用作实际缓存键。 |
queryKey |
TQueryKey & object |
undefined |
此查询所用的查询键。查询键将被哈希为一个稳定哈希值。更多信息请参阅 查询键。只要 enabled 未设为 false,该查询就会在查询键变更时自动更新。 |
queryKeyHashFn? |
(queryKey: TQueryKey) => string |
undefined |
若指定此函数,则使用它对 queryKey 进行哈希并生成字符串。 |
refetchInterval? |
| number | false | ((query: Query<TQueryFnData, TError, InfiniteData<TQueryFnData, TPageParam>, TQueryKey>) => number | false | undefined) |
false |
若设为数字,查询将以该毫秒频率持续重新拉取。若设为函数,则该函数将使用最新数据和查询来计算频率。 |
refetchIntervalInBackground? |
boolean |
false |
若设为 true,即使查询所在的标签页/窗口处于后台,查询也会继续重新拉取。 |
refetchOnMount? |
| boolean | "always" | ((query: Query<TQueryFnData, TError, InfiniteData<TQueryFnData, TPageParam>, TQueryKey>) => boolean | "always") |
true |
若设为 true,当数据过期时,查询将在挂载时重新拉取。若设为 false,将禁用额外查询实例触发后台重新拉取。若设为 'always',查询将在每次挂载时始终重新拉取(除非使用 staleTime: 'static')。若设为函数,则该函数将使用最新数据和查询来计算该值。 |
refetchOnReconnect? |
| boolean | "always" | ((query: Query<TQueryFnData, TError, InfiniteData<TQueryFnData, TPageParam>, TQueryKey>) => boolean | "always") |
undefined |
若设为 true,当数据过期时,查询将在网络重连后重新拉取。若设为 false,查询将不在网络重连后重新拉取。若设为 'always',查询将在每次网络重连后始终重新拉取(除非使用 staleTime: 'static')。若设为函数,则该函数将使用最新数据和查询来计算该值。默认值为 true,除非 networkMode 为 'always'。 |
refetchOnWindowFocus? |
| boolean | "always" | ((query: Query<TQueryFnData, TError, InfiniteData<TQueryFnData, TPageParam>, TQueryKey>) => boolean | "always") |
true |
若设为 true,当数据过期时,查询将在窗口获得焦点后重新拉取。若设为 false,查询将不在窗口获得焦点后重新拉取。若设为 'always',查询将在每次窗口获得焦点后始终重新拉取(除非使用 staleTime: 'static')。若设为函数,则该函数将使用最新数据和查询来计算该值。 |
retry? |
| number | false | true | ((failureCount: number, error: TError) => boolean) |
undefined |
若为 false,失败的查询默认不重试。若为 true,失败的查询将无限重试。若设为整数(例如 3),失败的查询将重试直至失败次数达到该数值。若设为函数 (failureCount, error) => boolean,失败的查询将重试直至该函数返回 false。客户端默认为 3,服务端默认为 0。 |
retryDelay? |
number | ((failureCount: number, error: TError) => number) |
undefined |
此函数接收一个 retryAttempt 整数和实际错误,并以毫秒为单位返回下次尝试前应延迟的时间。类似 attempt => Math.min(attempt > 1 ? 2 ** attempt * 1000 : 1000, 30 * 1000) 的函数应用指数退避策略;类似 attempt => attempt * 1000 的函数应用线性退避策略。默认函数应用指数退避策略,上限为 30 秒。 |
retryOnMount? |
| false | true | ((query: Query<TQueryFnData, TError, InfiniteData<TQueryFnData, TPageParam>, TQueryKey>) => boolean) |
true |
若设为 false,包含错误的查询在挂载时将不会重试。若设为函数,则该函数将使用查询来计算该值。 |
select? |
(data: InfiniteData) => TData |
undefined |
此选项可用于转换或选取查询函数返回的数据的一部分。它影响返回的 data 值,但不影响存储在查询缓存中的内容。select 函数仅在 data 发生变化或 select 函数自身的引用发生变化时运行。为优化性能,请对函数进行记忆化处理,使其引用在多次调用中保持稳定。 |
staleTime? |
| number | "static" | ((query: Query<TQueryFnData, TError, InfiniteData<TQueryFnData, TPageParam>, TQueryKey>) => number | "static") |
0 |
数据被视为过期前的毫秒数。若设为 Infinity,数据将永远不会被视为过期。若设为 'static',数据将永远不会被视为过期。若设为函数,则该函数将使用查询来计算 staleTime。 |
structuralSharing? |
boolean | ((oldData: unknown, newData: unknown) => unknown) |
true |
将此选项设为 false 可禁用查询结果之间的结构共享。将其设为一个接收旧数据和新数据并返回同类型已解析数据的函数,即可实现自定义结构共享逻辑。 |
suspense? |
boolean |
false |
若设为 true,查询将在 status === 'pending' 时挂起,并在 status === 'error' 时抛出错误。 |
throwOnError? |
| false | true | ((error: TError, query: Query<TQueryFnData, TError, InfiniteData<TQueryFnData, TPageParam>, TQueryKey>) => boolean) |
false |
是否应抛出错误而非设置 error 属性。若设为 true 或 suspense 为 true,所有错误都将抛出至错误边界。若设为 false 且 suspense 也为 false,错误将作为状态返回。若设为函数,则该函数将接收错误和查询,并应返回一个布尔值,指示是否应在错误边界中显示错误(true)或作为状态返回错误(false)。 |
queryClient?
使用此选项可指定自定义的 QueryClient。否则,将使用离当前组件最近的上下文中的 QueryClient。
返回值
CreateInfiniteQueryResult<TData, TError>
当前查询结果,以及用于分页的 fetchNextPage/fetchPreviousPage/hasNextPage/hasPreviousPage 函数。
返回结果属性
| 属性 | 类型 | 描述 |
|---|---|---|
data |
TData | undefined |
查询最后一次成功解析的数据。 |
dataUpdatedAt |
number |
查询最近一次返回 status 为 "success" 状态的时间戳。 |
error |
TError | null |
查询的错误对象(如果抛出了错误)。- 默认值为 null。 |
errorUpdateCount |
number |
所有错误的总数。 |
errorUpdatedAt |
number |
查询最近一次返回 status 为 "error" 状态的时间戳。 |
failureCount |
number |
查询失败次数。- 每次查询失败时递增。- 查询成功时重置为 0。 |
failureReason |
TError | null |
查询重试失败的原因。- 查询成功时重置为 null。 |
fetchNextPage |
(options?: FetchNextPageOptions) => Promise<InfiniteQueryObserverResult<TData, TError>> |
此函数用于拉取下一页结果。 |
fetchPreviousPage |
(options?: FetchPreviousPageOptions) => Promise<InfiniteQueryObserverResult<TData, TError>> |
此函数用于拉取上一页结果。 |
fetchStatus |
"fetching" | "paused" | "idle" |
查询的拉取状态。- fetching:当 queryFn 正在执行时为 true,包括初始 pending 和后台重新拉取。- paused:查询本应拉取,但已被 paused。- idle:查询未处于拉取中。- 更多信息请参阅 Network Mode。 |
hasNextPage |
boolean |
若存在下一页(通过 getNextPageParam 选项判定),则为 true。 |
hasPreviousPage |
boolean |
若存在上一页(通过 getPreviousPageParam 选项判定),则为 true。 |
isEnabled |
boolean |
若该观察者已启用,则为 true;否则为 false。 |
isError |
boolean |
基于 status 变量推导出的布尔值,仅为方便使用。- 若查询尝试发生错误,则为 true。 |
isFetched |
boolean |
若查询已完成拉取,则为 true。 |
isFetchedAfterMount |
boolean |
若查询在组件挂载后完成拉取,则为 true。- 此属性可用于避免显示任何先前缓存的数据。 |
isFetching |
boolean |
基于 fetchStatus 变量推导出的布尔值,仅为方便使用。- 当 queryFn 正在执行时(包括初始 pending 和后台重新拉取)为 true。 |
isFetchingNextPage |
boolean |
使用 fetchNextPage 拉取下一页时为 true。 |
isFetchingPreviousPage |
boolean |
使用 fetchPreviousPage 拉取上一页时为 true。 |
isFetchNextPageError |
boolean |
若拉取下一页时查询失败,则为 true。 |
isFetchPreviousPageError |
boolean |
若拉取上一页时查询失败,则为 true。 |
isInitialLoading |
boolean |
已弃用 isInitialLoading 已被 isLoading 取代,将在下一个主版本中移除。 |
isLoading |
boolean |
若查询的首次拉取正在进行中,则为 true。- 等同于 isFetching && isPending。 |
isLoadingError |
boolean |
若查询首次拉取失败,则为 true。 |
isPaused |
boolean |
基于 fetchStatus 变量推导出的布尔值,仅为方便使用。- 查询本应拉取,但已被 paused。 |
isPending |
boolean |
若尚无缓存数据且尚未完成任何查询尝试,则为 pending。 |
isPlaceholderData |
boolean |
若当前显示的数据为占位数据,则为 true。 |
isRefetchError |
boolean |
若查询在重新拉取时失败,则为 true。 |
isRefetching |
boolean |
若后台重新拉取正在进行中,则为 true(不包含 初始 pending)。- 等同于 isFetching && !isPending。 |
isStale |
boolean |
若缓存中的数据已失效,或数据比给定的 staleTime 更旧,则为 true。 |
isSuccess |
boolean |
基于 status 变量推导出的布尔值,仅为方便使用。- 若查询已收到无错误响应并已准备好显示其数据,则为 true。 |
refetch |
(options?: RefetchOptions) => Promise<QueryObserverResult<TData, TError>> |
用于手动重新拉取查询的函数。 |
status |
"error" | "pending" | "success" |
查询的状态。- 可能为:- pending:若尚无缓存数据且尚未完成任何查询尝试。- error:若查询尝试发生错误。- success:若查询已收到无错误响应并已准备好显示其数据。 |