File: sorting.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
v8
Search...
+ K
Menu
Getting Started
Core Guides
Feature Guides
Core APIs
Feature APIs
Enterprise
Examples
Framework
React
Version
v8
Menu
Getting Started
Core Guides
Feature Guides
Core APIs
Feature APIs
Enterprise
Examples
On this page
Copy Markdown
Sorting state is stored on the table using the following shape:
tsx
export type SortDirection = 'asc' | 'desc'
export type ColumnSort = {
id: string
desc: boolean
}
export type SortingState = ColumnSort[]
export type SortingTableState = {
sorting: SortingState
}
export type SortDirection = 'asc' | 'desc'
export type ColumnSort = {
id: string
desc: boolean
}
export type SortingState = ColumnSort[]
export type SortingTableState = {
sorting: SortingState
}
Sorting Functions
-----------------
The following sorting functions are built-in to the table core:
Every sorting function receives 2 rows and a column ID and are expected to compare the two rows using the column ID to return -1, 0, or 1 in ascending order. Here's a cheat sheet:
| Return | Ascending Order | | --- | --- | | -1 | a < b | | 0 | a === b | | 1 | a > b |
This is the type signature for every sorting function:
tsx
export type SortingFn<TData extends AnyData> = {
(rowA: Row<TData>, rowB: Row<TData>, columnId: string): number
}
export type SortingFn<TData extends AnyData> = {
(rowA: Row<TData>, rowB: Row<TData>, columnId: string): number
}
Sorting functions can be used/referenced/defined by passing the following to columnDefinition.sortingFn:
The final list of sorting functions available for the columnDef.sortingFn use the following type:
tsx
export type SortingFnOption<TData extends AnyData> =
| 'auto'
| SortingFns
| BuiltInSortingFns
| SortingFn<TData>
export type SortingFnOption<TData extends AnyData> =
| 'auto'
| SortingFns
| BuiltInSortingFns
| SortingFn<TData>
Column Def Options
------------------
### sortingFn
tsx
sortingFn?: SortingFn | keyof SortingFns | keyof BuiltInSortingFns
sortingFn?: SortingFn | keyof SortingFns | keyof BuiltInSortingFns
The sorting function to use with this column.
Options:
tsx
sortDescFirst?: boolean
sortDescFirst?: boolean
Set to true for sorting toggles on this column to start in the descending direction.
tsx
enableSorting?: boolean
enableSorting?: boolean
Enables/Disables sorting for this column.
tsx
enableMultiSort?: boolean
enableMultiSort?: boolean
Enables/Disables multi-sorting for this column.
tsx
invertSorting?: boolean
invertSorting?: boolean
Inverts the order of the sorting for this column. This is useful for values that have an inverted best/worst scale where lower numbers are better, eg. a ranking (1st, 2nd, 3rd) or golf-like scoring
tsx
sortUndefined?: 'first' | 'last' | false | -1 | 1 // defaults to 1
sortUndefined?: 'first' | 'last' | false | -1 | 1 // defaults to 1
NOTE: 'first' and 'last' options are new in v8.16.0
Column API
----------
### getAutoSortingFn
tsx
getAutoSortingFn: () => SortingFn<TData>
getAutoSortingFn: () => SortingFn<TData>
Returns a sorting function automatically inferred based on the columns values.
tsx
getAutoSortDir: () => SortDirection
getAutoSortDir: () => SortDirection
Returns a sort direction automatically inferred based on the columns values.
tsx
getSortingFn: () => SortingFn<TData>
getSortingFn: () => SortingFn<TData>
Returns the resolved sorting function to be used for this column
tsx
getNextSortingOrder: () => SortDirection | false
getNextSortingOrder: () => SortDirection | false
Returns the next sorting order.
tsx
getCanSort: () => boolean
getCanSort: () => boolean
Returns whether this column can be sorted.
tsx
getCanMultiSort: () => boolean
getCanMultiSort: () => boolean
Returns whether this column can be multi-sorted.
tsx
getSortIndex: () => number
getSortIndex: () => number
Returns the index position of this column's sorting within the sorting state
tsx
getIsSorted: () => false | SortDirection
getIsSorted: () => false | SortDirection
Returns whether this column is sorted.
tsx
getFirstSortDir: () => SortDirection
getFirstSortDir: () => SortDirection
Returns the first direction that should be used when sorting this column.
tsx
clearSorting: () => void
clearSorting: () => void
Removes this column from the table's sorting state
tsx
toggleSorting: (desc?: boolean, isMulti?: boolean) => void
toggleSorting: (desc?: boolean, isMulti?: boolean) => void
Toggles this columns sorting state. If desc is provided, it will force the sort direction to that value. If isMulti is provided, it will additivity multi-sort the column (or toggle it if it is already sorted).
tsx
getToggleSortingHandler: () => undefined | ((event: unknown) => void)
getToggleSortingHandler: () => undefined | ((event: unknown) => void)
Returns a function that can be used to toggle this column's sorting state. This is useful for attaching a click handler to the column header.
Table Options
-------------
### sortingFns
tsx
sortingFns?: Record<string, SortingFn>
sortingFns?: Record<string, SortingFn>
This option allows you to define custom sorting functions that can be referenced in a column's sortingFn option by their key. Example:
tsx
declare module '@tanstack/table-core' {
interface SortingFns {
myCustomSorting: SortingFn<unknown>
}
}
const column = columnHelper.data('key', {
sortingFn: 'myCustomSorting',
})
const table = useReactTable({
columns: [column],
sortingFns: {
myCustomSorting: (rowA: any, rowB: any, columnId: any): number =>
rowA.getValue(columnId).value < rowB.getValue(columnId).value ? 1 : -1,
},
})
declare module '@tanstack/table-core' {
interface SortingFns {
myCustomSorting: SortingFn<unknown>
}
}
const column = columnHelper.data('key', {
sortingFn: 'myCustomSorting',
})
const table = useReactTable({
columns: [column],
sortingFns: {
myCustomSorting: (rowA: any, rowB: any, columnId: any): number =>
rowA.getValue(columnId).value < rowB.getValue(columnId).value ? 1 : -1,
},
})
tsx
manualSorting?: boolean
manualSorting?: boolean
Enables manual sorting for the table. If this is true, you will be expected to sort your data before it is passed to the table. This is useful if you are doing server-side sorting.
tsx
onSortingChange?: OnChangeFn<SortingState>
onSortingChange?: OnChangeFn<SortingState>
If provided, this function will be called with an updaterFn when state.sorting changes. This overrides the default internal state management, so you will need to persist the state change either fully or partially outside of the table.
tsx
enableSorting?: boolean
enableSorting?: boolean
Enables/Disables sorting for the table.
tsx
enableSortingRemoval?: boolean
enableSortingRemoval?: boolean
Enables/Disables the ability to remove sorting for the table.
tsx
enableMultiRemove?: boolean
enableMultiRemove?: boolean
Enables/disables the ability to remove multi-sorts
tsx
enableMultiSort?: boolean
enableMultiSort?: boolean
Enables/Disables multi-sorting for the table.
tsx
sortDescFirst?: boolean
sortDescFirst?: boolean
If true, all sorts will default to descending as their first toggle state.
tsx
getSortedRowModel?: (table: Table<TData>) => () => RowModel<TData>
getSortedRowModel?: (table: Table<TData>) => () => RowModel<TData>
This function is used to retrieve the sorted row model. If using server-side sorting, this function is not required. To use client-side sorting, pass the exported getSortedRowModel() from your adapter to your table or implement your own.
tsx
maxMultiSortColCount?: number
maxMultiSortColCount?: number
Set a maximum number of columns that can be multi-sorted.
tsx
isMultiSortEvent?: (e: unknown) => boolean
isMultiSortEvent?: (e: unknown) => boolean
Pass a custom function that will be used to determine if a multi-sort event should be triggered. It is passed the event from the sort toggle handler and should return true if the event should trigger a multi-sort.
Table API
---------
### setSorting
tsx
setSorting: (updater: Updater<SortingState>) => void
setSorting: (updater: Updater<SortingState>) => void
Sets or updates the state.sorting state.
tsx
resetSorting: (defaultState?: boolean) => void
resetSorting: (defaultState?: boolean) => void
Resets the sorting state to initialState.sorting, or true can be passed to force a default blank state reset to [].
tsx
getPreSortedRowModel: () => RowModel<TData>
getPreSortedRowModel: () => RowModel<TData>
Returns the row model for the table before any sorting has been applied.
tsx
getSortedRowModel: () => RowModel<TData>
getSortedRowModel: () => RowModel<TData>
Returns the row model for the table after sorting has been applied.
