数据表格 - 排序
基于一个或多个条件轻松对行进行排序。
默认情况下,数据表格用户已启用排序功能,无需任何显式配置即可直接使用。用户只需单击列标题即可设置排序规则。后续单击会更改列的排序方向。您可以在标题的箭头指示器上看到应用的方向。
将排序规则传递给数据表格
模型结构
排序模型是排序项的列表。每个项代表一个排序规则,由几个元素组成
sortingItem.field
:规则应用的字段。sortingItem.sort
:排序方向('asc'
、'desc'
、null
或undefined
)。如果为null
或undefined
,则规则不适用。
初始化排序模型
默认情况下,用户已启用排序功能。但是,如果您要设置初始排序顺序,只需将模型提供给 initialState
prop。
<DataGrid
initialState={{
sorting: {
sortModel: [{ field: 'rating', sort: 'desc' }],
},
}}
/>
对某些列
默认情况下,所有列都是可排序的。要禁用列的排序,请将 GridColDef
的 sortable
属性设置为 false
。在以下演示中,用户无法从 UI 对*评分*列进行排序。
<DataGrid columns={[...columns, { field: 'rating', sortable: false }]} />
以编程方式对不可排序的列进行排序
colDef.sortable
设置为 false
的列无法从网格 UI 进行排序,但仍然可以通过编程方式进行排序。要向此类列添加排序规则,您可以初始化 sortModel
,使用 sortModel
prop,或使用 API 方法 sortColumn
或 setSortModel
。
在以下演示中,firstName
列默认情况下无法通过网格 UI 进行排序,但它通过自定义构建的 UI 以编程方式进行排序。
排序时重置页码
默认情况下,排序不会更改当前页码。要在应用新排序时将用户返回到第一页,请使用 resetPageOnSortFilter
prop。
自定义比较器
比较器决定了应如何对两个单元格值进行排序。
每种列类型都带有默认的比较器方法。您可以通过导入以下函数来重用它们
gridStringOrNumberComparator
(由string
和singleSelect
列使用)gridNumberComparator
(由number
和boolean
列使用)gridDateComparator
(由date
和date-time
列使用)
要在特定列中扩展或修改此行为,您可以传入自定义比较器,并覆盖 GridColDef
接口的 sortComparator
属性。
从头开始创建比较器
在以下演示中,“创建于”列的排序基于 createdOn
字段的月份中的日期。这是一个完全自定义的排序比较器。
组合内置比较器
在以下演示中,“名称”列组合了 name
和 isAdmin
字段。排序首先基于 isAdmin
,然后在必要时基于 name
。它重用了内置的排序比较器。
非对称比较器
数据表格认为 sortComparator
函数是对称的,通过将其乘以 `-1` 自动反转降序排序的返回值。
虽然这对于大多数用例来说已经足够了,但是可以使用 getSortComparator
函数定义一个非对称比较器——它接收排序方向作为参数并返回一个比较器函数。
在下面的演示中,getSortComparator
函数用于“数量”列,以在应用排序时将 null
值保持在底部(无论排序方向如何)
自定义排序顺序
默认情况下,排序顺序在以下三种不同模式之间循环
const sortingOrder = ['asc', 'desc', null];
实际上,当您单击未排序的列时,它将按升序排序 (`asc`)。下一次单击将使其按降序排序 (`desc`)。再次单击将删除排序 (`null`),恢复为数据提供的顺序。
对所有列
可以使用 sortingOrder
prop 覆盖所有列的默认排序顺序。在以下演示中,列仅可按降序或升序排序。
每列
可以通过设置 GridColDef
接口的 sortingOrder
属性来配置(和覆盖)每列的排序顺序
const columns: GridColDef = [
{ field: 'rating', sortingOrder: ['desc', 'asc', null] },
];
服务器端排序
可以通过将 sortingMode
prop 设置为 server
并实现 onSortModelChange
处理程序来在服务器端运行排序。
applySorting()
将当前排序模型应用于行。
签名
applySorting: () => void
getRowIdFromRowIndex()
获取特定索引处行的 GridRowId。该索引基于已排序但未经过滤的行列表。
签名
getRowIdFromRowIndex: (index: number) => GridRowId
getSortedRowIds()
返回根据活动排序模型排序的所有行 ID。
签名
getSortedRowIds: () => GridRowId[]
getSortedRows()
返回根据活动排序模型排序的所有行。
签名
getSortedRows: () => GridRowModel[]
getSortModel()
返回当前应用于网格的排序模型。
签名
getSortModel: () => GridSortModel
setSortModel()
更新排序模型并触发行的排序。
签名
setSortModel: (model: GridSortModel) => void
sortColumn()
对列进行排序。
签名
sortColumn: (field: GridColDef['field'], direction?: GridSortDirection, allowMultipleSorting?: boolean) => void
gridSortModelSelector
获取当前排序模型。签名
gridSortModelSelector: (apiRef: GridApiRef) => GridSortModel
// or
gridSortModelSelector: (state: GridState, instanceId?: number) => GridSortModel
示例
gridSortModelSelector(apiRef)
// or
gridSortModelSelector(state, apiRef.current.instanceId)
gridSortedRowEntriesSelector
获取排序过程后行的 ID 和模型。签名
gridSortedRowEntriesSelector: (apiRef: GridApiRef) => GridRowEntry<GridValidRowModel>[]
// or
gridSortedRowEntriesSelector: (state: GridState, instanceId?: number) => GridRowEntry<GridValidRowModel>[]
示例
gridSortedRowEntriesSelector(apiRef)
// or
gridSortedRowEntriesSelector(state, apiRef.current.instanceId)
gridSortedRowIdsSelector
获取排序过程后行的 ID。签名
gridSortedRowIdsSelector: (apiRef: GridApiRef) => GridRowId[]
// or
gridSortedRowIdsSelector: (state: GridState, instanceId?: number) => GridRowId[]
示例
gridSortedRowIdsSelector(apiRef)
// or
gridSortedRowIdsSelector(state, apiRef.current.instanceId)