File: useLiveInfiniteQuery.md | Updated: 11/15/2025
Search...
+ K
Auto
Docs Examples GitHub Contributors
Docs Examples GitHub Contributors
Docs Examples GitHub Contributors
Docs Examples Github Contributors
Docs Examples Github Contributors
Docs Examples Github Contributors
Docs Examples Github Contributors
Docs Examples Github Contributors
Maintainers Partners Support Learn StatsBETA Discord Merch Blog GitHub Ethos Brand Guide
Documentation
Framework
React
Version
Latest
Search...
+ K
Menu
Getting Started
Guides
Collections
Frameworks
Community
API Reference
Framework
React
Version
Latest
Menu
Getting Started
Guides
Collections
Frameworks
Community
API Reference
On this page
Copy Markdown
Function: useLiveInfiniteQuery()
================================
Call Signature
--------------
ts
function useLiveInfiniteQuery<TResult, TKey, TUtils>(liveQueryCollection, config): UseLiveInfiniteQueryReturn<any>;
function useLiveInfiniteQuery<TResult, TKey, TUtils>(liveQueryCollection, config): UseLiveInfiniteQueryReturn<any>;
Defined in: useLiveInfiniteQuery.ts:113
Create an infinite query using a query function with live updates
Uses utils.setWindow() to dynamically adjust the limit/offset window without recreating the live query collection on each page change.
### Type Parameters #### TResult
TResult extends object
TKey extends string | number
TUtils extends Record<string, any>
### Parameters #### liveQueryCollection
Collection<TResult, TKey, TUtils, StandardSchemaV1<unknown, unknown>, TResult> & NonSingleResult
UseLiveInfiniteQueryConfig <any>
Configuration including pageSize and getNextPageParam
UseLiveInfiniteQueryReturn <any>
Object with pages, data, and pagination controls
ts
// Basic infinite query
const { data, pages, fetchNextPage, hasNextPage } = useLiveInfiniteQuery(
(q) => q
.from({ posts: postsCollection })
.orderBy(({ posts }) => posts.createdAt, 'desc')
.select(({ posts }) => ({
id: posts.id,
title: posts.title
})),
{
pageSize: 20,
getNextPageParam: (lastPage, allPages) =>
lastPage.length === 20 ? allPages.length : undefined
}
)
// Basic infinite query
const { data, pages, fetchNextPage, hasNextPage } = useLiveInfiniteQuery(
(q) => q
.from({ posts: postsCollection })
.orderBy(({ posts }) => posts.createdAt, 'desc')
.select(({ posts }) => ({
id: posts.id,
title: posts.title
})),
{
pageSize: 20,
getNextPageParam: (lastPage, allPages) =>
lastPage.length === 20 ? allPages.length : undefined
}
)
ts
// With dependencies
const { pages, fetchNextPage } = useLiveInfiniteQuery(
(q) => q
.from({ posts: postsCollection })
.where(({ posts }) => eq(posts.category, category))
.orderBy(({ posts }) => posts.createdAt, 'desc'),
{
pageSize: 10,
getNextPageParam: (lastPage) =>
lastPage.length === 10 ? lastPage.length : undefined
},
[category]
)
// With dependencies
const { pages, fetchNextPage } = useLiveInfiniteQuery(
(q) => q
.from({ posts: postsCollection })
.where(({ posts }) => eq(posts.category, category))
.orderBy(({ posts }) => posts.createdAt, 'desc'),
{
pageSize: 10,
getNextPageParam: (lastPage) =>
lastPage.length === 10 ? lastPage.length : undefined
},
[category]
)
ts
// Router loader pattern with pre-created collection
// In loader:
const postsQuery = createLiveQueryCollection({
query: (q) => q
.from({ posts: postsCollection })
.orderBy(({ posts }) => posts.createdAt, 'desc')
.limit(20)
})
await postsQuery.preload()
return { postsQuery }
// In component:
const { postsQuery } = useLoaderData()
const { data, fetchNextPage, hasNextPage } = useLiveInfiniteQuery(
postsQuery,
{
pageSize: 20,
getNextPageParam: (lastPage) => lastPage.length === 20 ? lastPage.length : undefined
}
)
// Router loader pattern with pre-created collection
// In loader:
const postsQuery = createLiveQueryCollection({
query: (q) => q
.from({ posts: postsCollection })
.orderBy(({ posts }) => posts.createdAt, 'desc')
.limit(20)
})
await postsQuery.preload()
return { postsQuery }
// In component:
const { postsQuery } = useLoaderData()
const { data, fetchNextPage, hasNextPage } = useLiveInfiniteQuery(
postsQuery,
{
pageSize: 20,
getNextPageParam: (lastPage) => lastPage.length === 20 ? lastPage.length : undefined
}
)
ts
function useLiveInfiniteQuery<TContext>(
queryFn,
config,
deps?): UseLiveInfiniteQueryReturn<TContext>;
function useLiveInfiniteQuery<TContext>(
queryFn,
config,
deps?): UseLiveInfiniteQueryReturn<TContext>;
Defined in: useLiveInfiniteQuery.ts:123
Create an infinite query using a query function with live updates
Uses utils.setWindow() to dynamically adjust the limit/offset window without recreating the live query collection on each page change.
### Type Parameters #### TContext
TContext extends Context
(q) => QueryBuilder<TContext>
Query function that defines what data to fetch. Must include .orderBy() for setWindow to work.
UseLiveInfiniteQueryConfig <TContext>
Configuration including pageSize and getNextPageParam
unknown[]
Array of dependencies that trigger query re-execution when changed
UseLiveInfiniteQueryReturn <TContext>
Object with pages, data, and pagination controls
ts
// Basic infinite query
const { data, pages, fetchNextPage, hasNextPage } = useLiveInfiniteQuery(
(q) => q
.from({ posts: postsCollection })
.orderBy(({ posts }) => posts.createdAt, 'desc')
.select(({ posts }) => ({
id: posts.id,
title: posts.title
})),
{
pageSize: 20,
getNextPageParam: (lastPage, allPages) =>
lastPage.length === 20 ? allPages.length : undefined
}
)
// Basic infinite query
const { data, pages, fetchNextPage, hasNextPage } = useLiveInfiniteQuery(
(q) => q
.from({ posts: postsCollection })
.orderBy(({ posts }) => posts.createdAt, 'desc')
.select(({ posts }) => ({
id: posts.id,
title: posts.title
})),
{
pageSize: 20,
getNextPageParam: (lastPage, allPages) =>
lastPage.length === 20 ? allPages.length : undefined
}
)
ts
// With dependencies
const { pages, fetchNextPage } = useLiveInfiniteQuery(
(q) => q
.from({ posts: postsCollection })
.where(({ posts }) => eq(posts.category, category))
.orderBy(({ posts }) => posts.createdAt, 'desc'),
{
pageSize: 10,
getNextPageParam: (lastPage) =>
lastPage.length === 10 ? lastPage.length : undefined
},
[category]
)
// With dependencies
const { pages, fetchNextPage } = useLiveInfiniteQuery(
(q) => q
.from({ posts: postsCollection })
.where(({ posts }) => eq(posts.category, category))
.orderBy(({ posts }) => posts.createdAt, 'desc'),
{
pageSize: 10,
getNextPageParam: (lastPage) =>
lastPage.length === 10 ? lastPage.length : undefined
},
[category]
)
ts
// Router loader pattern with pre-created collection
// In loader:
const postsQuery = createLiveQueryCollection({
query: (q) => q
.from({ posts: postsCollection })
.orderBy(({ posts }) => posts.createdAt, 'desc')
.limit(20)
})
await postsQuery.preload()
return { postsQuery }
// In component:
const { postsQuery } = useLoaderData()
const { data, fetchNextPage, hasNextPage } = useLiveInfiniteQuery(
postsQuery,
{
pageSize: 20,
getNextPageParam: (lastPage) => lastPage.length === 20 ? lastPage.length : undefined
}
)
// Router loader pattern with pre-created collection
// In loader:
const postsQuery = createLiveQueryCollection({
query: (q) => q
.from({ posts: postsCollection })
.orderBy(({ posts }) => posts.createdAt, 'desc')
.limit(20)
})
await postsQuery.preload()
return { postsQuery }
// In component:
const { postsQuery } = useLoaderData()
const { data, fetchNextPage, hasNextPage } = useLiveInfiniteQuery(
postsQuery,
{
pageSize: 20,
getNextPageParam: (lastPage) => lastPage.length === 20 ? lastPage.length : undefined
}
)
