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<TablecraftFeatures, TData, any>[]requiredColumn definitions
paginationPaginationOptions | boolean—Same shape as useTable
sortingSortingOptions | boolean—Same shape as useTable
globalFilterboolean—Enable global search
columnFiltersboolean—Enable column filters
rowSelectionRowSelectionOptions | boolean—Opt-in row selection
columnVisibilityColumnVisibilityOptions | boolean—Opt-in column visibility
rowExpansionRowExpansionOptions | boolean—Opt-in row expansion
groupingGroupingOptions | boolean—Opt-in row grouping
columnPinningColumnPinningOptions | boolean—Opt-in column pinning
columnOrderColumnOrderOptions | boolean—Opt-in column ordering
rowPinningRowPinningOptions | boolean—Opt-in row pinning
columnResizingColumnResizingOptions | boolean—Opt-in column resizing — mode defaults to 'onEnd'
fuzzyboolean | FilterFn<TablecraftFeatures, TData>—Same caveat as useTable — true requires CJS/Node
persistPersistStorage | false—Same as useTable
persistKeystring—Storage key
persistOptionsPersistOptions—Which slices to persist
syncUrlboolean | URLSyncOptions—Same as useTable
staleTimenumber—TanStack Query staleTime
gcTimenumber—TanStack Query gcTime
enabledboolean—TanStack Query enabled
refetchOnWindowFocusboolean—TanStack Query pass-through
refetchOnMountboolean | 'always'—TanStack Query pass-through
refetchOnReconnectboolean | 'always'—TanStack Query pass-through
refetchIntervalnumber | false—TanStack Query pass-through
retryboolean | number—TanStack 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