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

createInfiniteQuery

更新于 2026-11-02 Solid 查看英文原文 ↗
TypeScript
1const createInfiniteQuery: {2<TQueryFnData, TError, TData, TQueryKey, TPageParam>  (options: DefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>, queryClient?: Accessor<QueryClient>): DefinedUseInfiniteQueryResult<TData, TError>;3<TQueryFnData, TError, TData, TQueryKey, TPageParam>  (options: UndefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>, queryClient?: Accessor<QueryClient>): UseInfiniteQueryResult<TData, TError>;4} = useInfiniteQuery;

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

调用签名

TypeScript
1<TQueryFnData, TError = Error, TData = InfiniteData<TQueryFnData, unknown>, TQueryKey extends readonly unknown[] = readonly unknown[], TPageParam = unknown>(options: DefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>, queryClient?: Accessor<QueryClient>): DefinedUseInfiniteQueryResult<TData, TError>;

useInfiniteQuery 的选项与 useQuery 完全相同,额外增加了 initialPageParam、getNextPageParam、getPreviousPageParam 和 maxPages。

当 initialData 已知被定义时,将选用此重载。

类型参数

TQueryFnData

TQueryFnData

TError

TError = Error

TData

TData = InfiniteData<TQueryFnData, unknown>

TQueryKey

TQueryKey extends readonly unknown[] = readonly unknown[]

TPageParam

TPageParam = unknown

参数

options

DefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>

一个返回所用 DefinedInitialDataInfiniteOptions 的访问器 —— 即所有可传给 useInfiniteQuery 的选项,且 initialData 已知被定义。

queryClient?

Accessor<QueryClient>

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

返回值

DefinedUseInfiniteQueryResult<TData, TError>

与 useQuery 相同的属性,并额外增加了 fetchNextPage、fetchPreviousPage、hasNextPage、hasPreviousPage、isFetchingNextPage 和 isFetchingPreviousPage。只要 select 未将 TData 修改为偏离其默认 InfiniteData<TQueryFnData> 形状,也会添加 data.pages 和 data.pageParams。

备注

请注意,命令式拉取调用(例如 fetchNextPage)可能会干扰默认的重新拉取行为,导致数据过期。请确保仅在响应用户操作时调用这些函数,或添加类似 hasNextPage && !isFetching 的条件。

参见

infiniteQueryOptions 可用于在 useInfiniteQuery 与 queryClient.infiniteQuery 等命令式 API 之间共享这些选项。

示例

TypeScript
1import { For } from 'solid-js'2import { useInfiniteQuery } from '@tanstack/solid-query'3 4function Projects() {5  // `projectsQuery.data` is never `undefined`, thanks to `initialData` — even if a refetch fails, so the6  // list stays visible alongside the error.7  const projectsQuery = useInfiniteQuery(() => ({8    queryKey: ['projects'],9    queryFn: ({ pageParam }) => fetchProjects(pageParam),10    initialPageParam: 0,11    getNextPageParam: (lastPage) => lastPage.nextId,12    initialData: { pages: [], pageParams: [] },13  }))14 15  return (16    <div>17      {projectsQuery.isError ? <span>Error: {projectsQuery.error.message}</span> : null}18      <ul>19        <For each={projectsQuery.data.pages}>20          {(page) => <For each={page.projects}>{(p) => <li>{p.name}</li>}</For>}21        </For>22      </ul>23    </div>24  )25}

调用签名

TypeScript
1<TQueryFnData, TError = Error, TData = InfiniteData<TQueryFnData, unknown>, TQueryKey extends readonly unknown[] = readonly unknown[], TPageParam = unknown>(options: UndefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>, queryClient?: Accessor<QueryClient>): UseInfiniteQueryResult<TData, TError>;

useInfiniteQuery 的选项与 useQuery 完全相同,额外增加了 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

UndefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>

一个返回所用 UndefinedInitialDataInfiniteOptions 的访问器 —— 即所有可传给 useInfiniteQuery 的选项。

queryClient?

Accessor<QueryClient>

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

返回值

UseInfiniteQueryResult<TData, TError>

与 useQuery 相同的属性,并额外增加了 fetchNextPage、fetchPreviousPage、hasNextPage、hasPreviousPage、isFetchingNextPage 和 isFetchingPreviousPage。只要 select 未将 TData 修改为偏离其默认 InfiniteData<TQueryFnData> 形状,也会添加 data.pages 和 data.pageParams。

备注

请注意,命令式拉取调用(例如 fetchNextPage)可能会干扰默认的重新拉取行为,导致数据过期。请确保仅在响应用户操作时调用这些函数,或添加类似 hasNextPage && !isFetching 的条件。

参见

infiniteQueryOptions 可用于在 useInfiniteQuery 与 queryClient.infiniteQuery 等命令式 API 之间共享这些选项。

示例

通过“加载更多”按钮点击获取下一页:

TypeScript
1import { For, Match, Switch } from 'solid-js'2import { useInfiniteQuery } from '@tanstack/solid-query'3 4function Projects() {5  const projectsQuery = useInfiniteQuery(() => ({6    queryKey: ['projects'],7    queryFn: ({ pageParam }) => fetchProjects(pageParam),8    initialPageParam: 0,9    getNextPageParam: (lastPage) => lastPage.nextId,10  }))11 12  return (13    <Switch>14      <Match when={projectsQuery.isPending}>Loading...</Match>15      <Match when={projectsQuery.isError}>Error: {projectsQuery.error.message}</Match>16      <Match when={projectsQuery.isSuccess}>17        <ul>18          <For each={projectsQuery.data.pages}>19            {(page) => <For each={page.projects}>{(p) => <li>{p.name}</li>}</For>}20          </For>21        </ul>22        <button23          onClick={() => projectsQuery.fetchNextPage()}24          disabled={!projectsQuery.hasNextPage || projectsQuery.isFetching}25        >26          {projectsQuery.isFetchingNextPage27            ? 'Loading more...'28            : projectsQuery.hasNextPage29              ? 'Load More'30              : 'Nothing more to load'}31        </button>32      </Match>33    </Switch>34  )35}

使用 IntersectionObserver 在列表末尾的哨兵元素上,随用户滚动自动获取下一页:

TypeScript
1import { For, Match, Switch, createEffect, onCleanup } from 'solid-js'2import { useInfiniteQuery } from '@tanstack/solid-query'3 4function Projects() {5  const projectsQuery = useInfiniteQuery(() => ({6    queryKey: ['projects'],7    queryFn: ({ pageParam }) => fetchProjects(pageParam),8    initialPageParam: 0,9    getNextPageParam: (lastPage) => lastPage.nextId,10  }))11 12  let sentinelRef: HTMLDivElement | undefined13 14  createEffect(() => {15    if (sentinelRef == null || !projectsQuery.hasNextPage || projectsQuery.isFetching) return16 17    const observer = new IntersectionObserver(([entry]) => {18      if (entry?.isIntersecting) projectsQuery.fetchNextPage()19    })20    observer.observe(sentinelRef)21 22    onCleanup(() => observer.disconnect())23  })24 25  return (26    <Switch>27      <Match when={projectsQuery.isPending}>Loading...</Match>28      <Match when={projectsQuery.isError}>Error: {projectsQuery.error.message}</Match>29      <Match when={projectsQuery.isSuccess}>30        <ul>31          <For each={projectsQuery.data.pages}>32            {(page) => <For each={page.projects}>{(p) => <li>{p.name}</li>}</For>}33          </For>34        </ul>35        <div ref={sentinelRef}>{projectsQuery.isFetchingNextPage ? 'Loading more...' : null}</div>36      </Match>37    </Switch>38  )39}

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

译自上游 59d11de