Tablecraft
API Reference

useQueryTable

Combines server-side tables with TanStack Query — automatic refetching on sort, page, or filter changes.

Combines the useServerTable model with TanStack Query. Automatically re-fetches when sort, page, or filter state changes.

Requires @tanstack/react-query:

npm i @tanstack/react-query

Signature

function useQueryTable<TData extends RowData>(
  options: UseQueryTableOptions<TData>
): UseQueryTableReturn<TData>

Options

OptionTypeDefaultDescription
queryKeyunknown[]requiredTanStack Query cache key
queryFn(context) => Promise<{ data: TData[], rowCount: number }>requiredFetcher
columnsColumnDef<TData, any>[]requiredColumn definitions
paginationPaginationOptions | booleanSame shape as useTable
sortingSortingOptions | booleanSame shape as useTable
globalFilterbooleanEnable global search
columnFiltersbooleanEnable column filters
rowSelectionRowSelectionOptions | booleanOpt-in row selection
columnVisibilityColumnVisibilityOptions | booleanOpt-in column visibility
rowExpansionRowExpansionOptions | booleanOpt-in row expansion
groupingGroupingOptions | booleanOpt-in row grouping
columnPinningColumnPinningOptions | booleanOpt-in column pinning
fuzzyboolean | FilterFn<TData>Same caveat as useTabletrue requires CJS/Node
persistPersistStorage | falseSame as useTable
persistKeystringStorage key
persistOptionsPersistOptionsWhich slices to persist
syncUrlboolean | URLSyncOptionsSame as useTable
staleTimenumberTanStack Query staleTime
gcTimenumberTanStack Query gcTime
enabledbooleanTanStack Query enabled
refetchOnWindowFocusbooleanTanStack Query pass-through
refetchOnMountboolean | 'always'TanStack Query pass-through
refetchOnReconnectboolean | 'always'TanStack Query pass-through
refetchIntervalnumber | falseTanStack Query pass-through
retryboolean | numberTanStack Query pass-through
queryOptionsRecord<string, unknown>Pass-through for any TanStack Query option not surfaced above

The queryFn context (QueryTableFnContext) receives:

PropertyType
pagination{ pageIndex: number, pageSize: number }
sortingSortingState
columnFiltersColumnFiltersState
globalFilterstring
groupingGroupingState

Return

UseQueryTableReturn<TData> extends UseTableReturn<TData> and adds:

PropertyTypeDescription
queryQueryState<TData>Raw query result — data, isLoading, isError, isFetching, isPlaceholderData, error, refetch, status, fetchStatus

Usage

import { useQueryTable } from '@marvinackerman/tablecraft/query'

const { table, pagination, sorting, query } = useQueryTable({
  queryKey: ['users'],
  queryFn: async ({ pagination, sorting, globalFilter, columnFilters }) => {
    const res = await api.getUsers({
      page: pagination.pageIndex,
      pageSize: pagination.pageSize,
      sort: sorting,
      search: globalFilter,
    })
    return { data: res.data, rowCount: res.total }
  },
  columns,
  pagination: { pageSize: 20 },
  sorting: true,
  globalFilter: true,
})

Notes

  • query is the raw TanStack Query result — use query.isLoading / query.isError for loading and error UI.
  • For cursor-based infinite lists instead of paginated pages, use useInfiniteTable.

On this page