列定义是构建表格的最重要部分。它们负责以下任务:
以下列定义的“类型”实际上不是 TypeScript 类型,而是一种描述列定义整体类别的方式:
“访问器列” Accessor Columns
“显示列” Display Columns
“分组列 Grouping Columns”
虽然列定义实际上只是普通的对象,但表格核心库提供了一个createColumnHelper
函数,该函数在调用时传入行类型,返回一个具有最高类型安全性的创建不同列定义类型的实用程序。
下面是创建和使用列助手的示例:
// 定义行的TS类型type Person = { firstName: string lastName: string age: number visits: number status: string progress: number}
const columnHelper = createColumnHelper<Person>()
// 创建一些列!const defaultColumns = [ // 显示列 columnHelper.display({ id: 'actions', cell: props => <RowActions row={props.row} />, }), // 分组列 columnHelper.group({ header: 'Name', footer: props => props.column.id, columns: [ // 访问器列 columnHelper.accessor('firstName', { cell: info => info.getValue(), footer: props => props.column.id, }), // 访问器列 columnHelper.accessor(row => row.lastName, { id: 'lastName', cell: info => info.getValue(), header: () => <span>Last Name</span>, footer: props => props.column.id, }), ], }), // 分组列 columnHelper.group({ header: 'Info', footer: props => props.column.id, columns: [ // 访问器列 columnHelper.accessor('age', { header: () => 'Age', footer: props => props.column.id, }), // 分组列 columnHelper.group({ header: 'More Info', columns: [ // 访问器列 columnHelper.accessor('visits', { header: () => <span>Visits</span>, footer: props => props.column.id, }), // 访问器列 columnHelper.accessor('status', { header: 'Status', footer: props => props.column.id, }), // 访问器列 columnHelper.accessor('progress', { header: 'Profile Progress', footer: props => props.column.id, }), ], }), ], }),]
数据列的独特之处在于必须配置以提取data
数组中每个项的原始值。
有三种方法可以实现这一点:
对象
,请使用与要提取的值对应的对象键。数组
,请使用与要提取的值对应的数组索引。如果每个项都是具有以下TS类型的对象:
type Person = { firstName: string lastName: string age: number visits: number status: string progress: number}
您可以像这样提取firstName
值:
columnHelper.accessor('firstName')
// 或者
{ accessorKey: 'firstName',}
如果每个项都是具有以下TS类型的数组:
type Sales = [Date, number]
您可以像这样提取number
值:
columnHelper.accessor(1)
// 或者
{ accessorKey: 1,}
如果每个项都是具有以下TS类型的对象:
type Person = { firstName: string lastName: string age: number visits: number status: string progress: number}
您可以像这样提取计算得到的全名值:
columnHelper.accessor(row => `${row.firstName} ${row.lastName}`, { id: 'fullName',})
// 或者
{ id: 'fullName', accessorFn: row => `${row.firstName} ${row.lastName}`,}
🧠 请记住,访问的值是用于排序、过滤等操作的值,因此您需要确保访问器函数返回一个可以进行有意义操作的原始值。如果返回的是非原始值,例如对象或数组,您将需要适当的过滤/排序/分组函数来操作它们,甚至可以自己提供! 😬
列使用三种策略进行唯一标识:
id
属性来唯一标识列,或者string
表头,将使用该表头字符串来唯一标识列🧠 一个简单的记忆方法:如果使用访问器函数定义列,请提供一个字符串表头或提供一个唯一的
id
属性。
默认情况下,列单元格将以字符串形式显示其数据模型值。您可以通过提供自定义的渲染实现来覆盖此行为。每个实现都会提供有关单元格、表头或表尾的相关信息,并返回您的框架适配器可以渲染的内容,例如 JSX/组件/字符串等。这将取决于您使用的适配器。
您可以使用以下几种格式化程序:
cell
:用于格式化单元格。aggregatedCell
:用于格式化聚合单元格。header
:用于格式化表头。footer
:用于格式化表尾。您可以通过将函数传递给cell
属性,并使用props.getValue()
函数访问单元格的值,来提供自定义的单元格格式化程序:
columnHelper.accessor('firstName', { cell: props => <span>{props.getValue().toUpperCase()}</span>,})
单元格格式化程序还会提供row
和table
对象,使您能够在单元格值之外自定义单元格格式化。下面的示例将firstName
作为访问器,但还显示了原始行对象上的前缀用户 ID:
columnHelper.accessor('firstName', { cell: props => ( <span>{`${props.row.original.id} - ${props.getValue()}`}</span> ),})
有关聚合单元格的更多信息,请参见分组。
表头和表尾无法访问行数据,但仍然使用相同的概念来显示自定义内容。