列是否可以进行列过滤取决于以下条件:
accessorKey
/accessorFn
定义的。column.enableColumnFilter
不设置为false
。options.enableColumnFilters
不设置为false
。options.enableFilters
不设置为false
。列是否可以进行全局过滤取决于以下条件:
accessorKey
/accessorFn
定义的。options.getColumnCanGlobalFilter
,则对于给定的列,它返回true
。如果未提供,则假定如果第一行的值是string
或number
类型,则列可进行全局过滤。column.enableColumnFilter
不设置为false
。options.enableColumnFilters
不设置为false
。options.enableFilters
不设置为false
。过滤状态使用以下结构存储在表格中:
export type FiltersTableState = { columnFilters: ColumnFiltersState globalFilter: any}
export type ColumnFiltersState = ColumnFilter[]
export type ColumnFilter = { id: string value: unknown}
以下过滤函数内置于表格核心:
includesString
includesStringSensitive
equalsString
equalsStringSensitive
arrIncludes
arrIncludesAll
arrIncludesSome
equals
Object.is
/===
weakEquals
==
inNumberRange
每个过滤函数接收以下参数:
如果应该包含过滤行,则返回true
,如果应该删除过滤行,则返回false
。
以下是每个过滤函数的类型签名:
export type FilterFn<TData extends AnyData> = { ( row: Row<TData>, columnId: string, filterValue: any, addMeta: (meta: any) => void ): boolean resolveFilterValue?: TransformFilterValueFn<TData> autoRemove?: ColumnFilterAutoRemoveTestFn<TData> addMeta?: (meta?: any) => void}
export type TransformFilterValueFn<TData extends AnyData> = ( value: any, column?: Column<TData>) => unknown
export type ColumnFilterAutoRemoveTestFn<TData extends AnyData> = ( value: any, column?: Column<TData>) => boolean
export type CustomFilterFns<TData extends AnyData> = Record< string, FilterFn<TData>>
filterFn.resolveFilterValue
在任何给定的filterFn
上的可选的“挂起”方法,允许过滤函数在将过滤值传递给过滤函数之前对其进行转换/清理/格式化。
filterFn.autoRemove
在任何给定的filterFn
上的可选的“挂起”方法,传递一个过滤值,并且如果过滤值应该从过滤状态中删除,则返回true
。例如,某些布尔类型的过滤器可能希望在过滤值设置为false
时从表格状态中删除过滤值。
可以通过将以下内容传递给columnDefinition.filterFn
或options.globalFilterFn
来使用/引用/定义过滤函数:
string
columnDefinition.filterFn
选项的函数columnDef.filterFn
和tableOptions.globalFilterFn
选项的最终过滤函数列表使用以下类型:
export type FilterFnOption<TData extends AnyData> = | 'auto' | BuiltInFilterFn | FilterFn<TData>
过滤数据通常会暴露有关数据的其他信息,这些信息可以用于帮助对相同数据进行其他未来操作。一个很好的例子是像match-sorter
这样的排名系统,它同时对数据进行排名、过滤和排序。虽然像match-sorter
这样的工具在单维度的过滤+排序任务中非常有意义,但构建表格的解耦过滤/排序架构使得它们非常难以使用和缓慢。
为了使排名/过滤/排序系统与表格一起工作,filterFn
可以选择使用过滤元数据值标记结果,以便稍后可以使用它们对数据进行排序/分组等操作。这是通过调用提供给自定义filterFn
的addMeta
函数来完成的。
以下是使用我们自己的match-sorter-utils
包(match-sorter
的实用程序分支)对数据进行排名、过滤和排序的示例:
import { sortingFns } from '@tanstack/react-table'
import { rankItem, compareItems } from '@tanstack/match-sorter-utils'
const fuzzyFilter = (row, columnId, value, addMeta) => { // 对项进行排名 const itemRank = rankItem(row.getValue(columnId), value)
// 存储排名信息 addMeta(itemRank)
// 返回是否应该过滤行 return itemRank.passed}
const fuzzySort = (rowA, rowB, columnId) => { let dir = 0
// 仅在列具有排名信息时才按排名排序 if (rowA.columnFiltersMeta[columnId]) { dir = compareItems( rowA.columnFiltersMeta[columnId]!, rowB.columnFiltersMeta[columnId]! ) }
// 提供一个字母数字的回退,用于当项的排名相等时 return dir === 0 ? sortingFns.alphanumeric(rowA, rowB, columnId) : dir}
filterFn
filterFn?: FilterFn | keyof FilterFns | keyof BuiltInFilterFns
用于此列的过滤函数。
选项:
enableColumnFilter
enableColumnFilter?: boolean
启用/禁用此列的列过滤。
enableGlobalFilter
enableGlobalFilter?: boolean
启用/禁用此列的全局过滤。
getCanFilter
getCanFilter: () => boolean
返回列是否可以进行列过滤。
getCanGlobalFilter
getCanGlobalFilter: () => boolean
返回列是否可以进行全局过滤。
getFilterIndex
getFilterIndex: () => number
返回列过滤器在表格的state.columnFilters
数组中的索引(包括-1
)。
getIsFiltered
getIsFiltered: () => boolean
返回列当前是否已过滤。
getFilterValue
getFilterValue: () => unknown
返回列的当前过滤值。
setFilterValue
setFilterValue: (updater: Updater<any>) => void
设置列的当前过滤值。可以传递值或更新函数以进行对现有值的不可变安全操作。
getAutoFilterFn
getAutoFilterFn: (columnId: string) => FilterFn<TData> | undefined
返回基于列的第一个已知值自动计算的过滤函数。
getFilterFn
getFilterFn: (columnId: string) => FilterFn<TData> | undefined
返回过滤函数(根据配置是用户定义的还是自动的)。
getFacetedRowModel
type getFacetedRowModel = () => RowModel<TData>
⚠️ 需要将有效的
getFacetedRowModel
函数传递给options.facetedRowModel
。通过导出的getFacetedRowModel
函数提供了一个默认实现。
返回应用了所有其他列过滤器但不包括自身过滤器的行模型。用于显示分面结果计数。
getFacetedUniqueValues
getFacetedUniqueValues: () => Map<any, number>
⚠️ 需要将有效的
getFacetedUniqueValues
函数传递给options.getFacetedUniqueValues
。通过导出的getFacetedUniqueValues
函数提供了一个默认实现。
计算并返回从column.getFacetedRowModel
派生的唯一值及其出现次数的Map
。用于显示分面结果值。
getFacetedMinMaxValues
getFacetedMinMaxValues: () => Map<any, number>
⚠️ 需要将有效的
getFacetedMinMaxValues
函数传递给options.getFacetedMinMaxValues
。通过导出的getFacetedMinMaxValues
函数提供了一个默认实现。
计算并返回从column.getFacetedRowModel
派生的最小值和最大值的元组。用于显示分面结果值。
columnFilters
columnFilters: Record<string, boolean>
行的列过滤器映射。此对象通过其列ID跟踪行是否通过/未通过特定过滤器。
columnFiltersMeta
columnFiltersMeta: Record<string, any>
行的列过滤器元数据映射。此对象跟踪在过滤过程中可选地为行提供的任何过滤元数据。
filterFns
filterFns?: Record<string, FilterFn>
此选项允许您定义自定义过滤函数,可以通过其键在列的filterFn
选项中引用。
示例:
declare module '@tanstack/table-core' { interface FilterFns { myCustomFilter: FilterFn<unknown> }}
const column = columnHelper.data('key', { filterFn: 'myCustomFilter',})
const table = useReactTable({ columns: [column], filterFns: { myCustomFilter: (rows, columnIds, filterValue) => { // 返回过滤后的行 }, },})
filterFromLeafRows
filterFromLeafRows?: boolean
默认情况下,从父行向下进行过滤(因此,如果父行被过滤掉,其所有子行也将被过滤掉)。将此选项设置为true
将导致从叶行向上进行过滤(这意味着只要其子行或孙行之一被包含在内,父行将被包含在内)。
maxLeafRowFilterDepth
maxLeafRowFilterDepth?: number
默认情况下,对所有行进行过滤(最大深度为100),无论它们是根级父行还是父行的子叶行。将此选项设置为0
将仅对根级父行应用过滤,所有子行保持未过滤状态。类似地,将此选项设置为1
将仅对深度为1的子叶行应用过滤,依此类推。
这对于希望行的整个子层次结构在应用过滤器时可见的情况非常有用。
enableFilters
enableFilters?: boolean
启用/禁用表格的所有过滤器。
manualFiltering
manualFiltering?: boolean
禁用对数据进行过滤的getFilteredRowModel
的使用。如果您的表格需要动态支持客户端和服务器端过滤,则可能会很有用。
onColumnFiltersChange
onColumnFiltersChange?: OnChangeFn<ColumnFiltersState>
如果提供,当state.columnFilters
更改时,将使用updaterFn
调用此函数。这将覆盖默认的内部状态管理,因此您需要在表格外部完全或部分地持久化状态更改。
enableColumnFilters
enableColumnFilters?: boolean
启用/禁用表格的所有列过滤器。
getFilteredRowModel
getFilteredRowModel?: ( table: Table<TData>) => () => RowModel<TData>
如果提供,此函数将一次调用每个表格,并应返回一个新函数,该函数在过滤表格时计算并返回表格的行模型。
{ getFilteredRowModel }
导出提供了一个默认实现。示例:
import { getFilteredRowModel } from '@tanstack/[adapter]-table'
getFilteredRowModel: getFilteredRowModel(),})
getColumnFacetedRowModel
getColumnFacetedRowModel: (columnId: string) => RowModel<TData>
返回给定列ID的分面行模型。
globalFilterFn
globalFilterFn?: FilterFn | keyof FilterFns | keyof BuiltInFilterFns
用于全局过滤的过滤函数。
选项:
onGlobalFilterChange
onGlobalFilterChange?: OnChangeFn<GlobalFilterState>
如果提供,当state.globalFilter
更改时,将使用updaterFn
调用此函数。这将覆盖默认的内部状态管理,因此您需要在表格外部完全或部分地持久化状态更改。
enableGlobalFilter
enableGlobalFilter?: boolean
启用/禁用表格的全局过滤。
getColumnCanGlobalFilter
getColumnCanGlobalFilter?: (column: Column<TData>) => boolean
如果提供,将使用列调用此函数,并应返回true
或false
,以指示是否应该使用此列进行全局过滤。如果列可能包含不是string
或number
(例如undefined
)的数据,这将非常有用。
setColumnFilters
setColumnFilters: (updater: Updater<ColumnFiltersState>) => void
设置或更新state.columnFilters
状态。
resetColumnFilters
resetColumnFilters: (defaultState?: boolean) => void
将columnFilters状态重置为initialState.columnFilters
,或者可以传递true
以强制将默认空状态重置为[]
。
getPreFilteredRowModel
getPreFilteredRowModel: () => RowModel<TData>
返回在应用任何列过滤之前的表格的行模型。
getFilteredRowModel
getFilteredRowModel: () => RowModel<TData>
返回在应用列过滤之后的表格的行模型。
setGlobalFilter
setGlobalFilter: (updater: Updater<any>) => void
设置或更新state.globalFilter
状态。
resetGlobalFilter
resetGlobalFilter: (defaultState?: boolean) => void
将globalFilter状态重置为initialState.globalFilter
,或者可以传递true
以强制将默认空状态重置为undefined
。
getGlobalAutoFilterFn
getGlobalAutoFilterFn: (columnId: string) => FilterFn<TData> | undefined
当前,此函数返回内置的includesString
过滤函数。在将来的版本中,它可能会根据提供的数据的性质返回更动态的过滤函数。
getGlobalFilterFn
getGlobalFilterFn: (columnId: string) => FilterFn<TData> | undefined
返回表格的全局过滤函数(根据配置是用户定义的还是自动的)。
getGlobalFacetedRowModel
getGlobalFacetedRowModel: () => RowModel<TData>
返回全局过滤的分面行模型。
getGlobalFacetedUniqueValues
getGlobalFacetedUniqueValues: () => Map<any, number>
返回全局过滤的分面唯一值。
getGlobalFacetedMinMaxValues
getGlobalFacetedMinMaxValues: () => [number, number]
返回全局过滤的分面最小值和最大值。