Skip to content

createInfiniteQuery

import { createInfiniteQuery } from '@effector-tanstack-query/core'
// Uses the default $queryClient.
function createInfiniteQuery<
TQueryFnData = unknown,
TError = Error,
TPageParam = unknown,
TData = InfiniteData<TQueryFnData, TPageParam>,
>(
options: CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,
): InfiniteQueryResult<TData, TError, TPageParam>
// Explicit client.
function createInfiniteQuery<
TQueryFnData = unknown,
TError = Error,
TPageParam = unknown,
TData = InfiniteData<TQueryFnData, TPageParam>,
>(
queryClient: QueryClient,
options: CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,
): InfiniteQueryResult<TData, TError, TPageParam>

Options

CreateInfiniteQueryOptions extends InfiniteQueryObserverOptions:

FieldTypeNotes
queryKeyEffectorQueryKeySame as createQuery
queryFn({ pageParam, queryKey, signal }) => Promise<TQueryFnData>First arg includes pageParam
getNextPageParam(lastPage, allPages, lastParam, allParams) => TPageParam | undefinedRequired
getPreviousPageParam(firstPage, allPages, firstParam, allParams) => TPageParam | undefinedOptional, for bidirectional
initialPageParamTPageParamRequired
maxPagesnumberCap on retained pages
enabledboolean | Store<boolean>Reactive
namestring (recommended)Stable name for SID-based SSR
…restAll other InfiniteQueryObserverOptionsselect, staleTime, placeholderData, …

Cancellation

Like createQuery, the page queryFn receives the standard TanStack AbortSignal as context.signal. Forward it to fetch and in-flight page requests cancel automatically on key change, unmounted(), or a createCancel event.

const postsQuery = createInfiniteQuery({
name: 'posts',
queryKey: ['posts'],
queryFn: ({ pageParam, signal }) =>
fetch(`/api/posts?page=${pageParam}`, { signal }).then((r) => r.json()),
getNextPageParam: (last) => last.next,
initialPageParam: 0,
})

Return value (InfiniteQueryResult<TData, TError, TPageParam>)

In addition to the base QueryResult fields:

FieldTypeDescription
$hasNextPageStore<boolean>More pages forward
$hasPreviousPageStore<boolean>More pages backward
$isFetchingNextPageStore<boolean>Next page in flight
$isFetchingPreviousPageStore<boolean>Previous page in flight
$isFetchNextPageErrorStore<boolean>Next page errored
$isFetchPreviousPageErrorStore<boolean>Previous page errored
fetchNextPageEventCallable<void>Trigger next-page fetch
fetchPreviousPageEventCallable<void>Trigger previous-page fetch
prefetchEventCallable<void>queryClient.fetchInfiniteQuery + awaits; for SSR — see createQuery#prefetch-vs-mounted

Plus finished{ success: Event<TData>; failure: Event<TError> }, the lifecycle events shared with createQuery (see Lifecycle events). finished.success carries the full TData (the InfiniteData page set, or the select result) and fires on each completed fetch — including fetchNextPage / fetchPreviousPage resolutions, which advance the data timestamp.

sample({
clock: postsQuery.finished.success,
target: trackPagesLoaded,
})

$data is Store<TData | undefined> where TData defaults to InfiniteData<TQueryFnData, TPageParam>. With select, it’s whatever your selector returns.

select

const q = createInfiniteQuery({
name: 'items',
queryKey: ['items'],
queryFn: ({ pageParam }: { pageParam: number }) => fetchPage(pageParam),
getNextPageParam: (last) => last.next,
initialPageParam: 0,
// Flatten pages into a single array
select: (data) => data.pages.flatMap((p) => p.items),
})
q.$data // Store<Item[] | undefined>

Refetch behavior

refresh() (or queryClient.invalidateQueries) refetches all loaded pages in order, recomputing pageParams from the freshly-fetched data via getNextPageParam. The original pageParams saved in cache are replaced.

This matches TanStack Query semantics — pagination cursors are derived, not stored as ground truth.