TanStack Table V8是React Table v7的一次重大重写,完全采用TypeScript编写。您的标记和CSS的整体结构/组织大部分保持不变,但许多API已被重命名或替换。
TanStack Table的新版本发布在@tanstack
作用域下。使用您喜欢的包管理器安装新包:
npm uninstall react-table @types/react-tablenpm install @tanstack/react-table
- import { useTable } from 'react-table'+ import { useReactTable } from '@tanstack/react-table'
类型现在包含在基础包中,因此您可以删除@types/react-table
包。
如果您愿意,可以保留旧的
react-table
包安装,以便逐步迁移代码。您应该能够在不同的表格中同时使用这两个包而没有任何问题。
useTable
重命名为useReactTable
- import { useTable, usePagination, useSortBy } from 'react-table';+ import {+ useReactTable,+ getCoreRowModel,+ getPaginationRowModel,+ getSortedRowModel+ } from '@tanstack/react-table';
// ...
- const tableInstance = useTable(- { columns, data },- useSortBy,- usePagination, //hook的顺序很重要- // 等等- );+ const tableInstance = useReactTable({+ columns,+ data,+ getCoreRowModel: getCoreRowModel(),+ getPaginationRowModel: getPaginationRowModel(),+ getSortedRowModel: getSortedRowModel(), //hook的顺序不再重要!+ // 等等+ });
disable*
表格选项已重命名为enable*
表格选项(例如,disableSortBy
现在是enableSorting
,disableGroupBy
现在是enableGrouping
等)。accessor
被重命名为accessorKey
或accessorFn
(取决于您是使用字符串还是函数)width
、minWidth
、maxWidth
被重命名为size
、minSize
、maxSize
createColumnHelper
函数,以获得更好的TypeScript提示(如果您喜欢,仍然可以只使用列定义的数组)。
const columns = [- {- accessor: 'firstName',- Header: 'First Name',- },- {- accessor: row => row.lastName,- Header: () => <span>Last Name</span>,- },
// 最佳的TypeScript体验,特别是在稍后使用`cell.getValue()`时+ columnHelper.accessor('firstName', { //accessorKey+ header: 'First Name',+ }),+ columnHelper.accessor(row => row.lastName, { //accessorFn+ header: () => <span>Last Name</span>,+ }),
// 或者(如果您喜欢)+ {+ accessorKey: 'firstName',+ header: 'First Name',+ },+ {+ accessorFn: row => row.lastName,+ header: () => <span>Last Name</span>,+ },]
注意:如果在组件内定义列,请仍然尽量给列定义一个稳定的标识。这将有助于性能并防止不必要的重新渲染。将列定义存储在
useMemo
或useState
hook中。
列选项名称更改
Header
被重命名为header
Cell
被重命名为cell
(单元格渲染函数也已更改,请参见下文)Footer
被重命名为footer
disable*
列选项已重命名为enable*
列选项(例如,disableSortBy
现在是enableSorting
,disableGroupBy
现在是enableGrouping
等)。sortType
是sortingFn
自定义单元格渲染器的更改
value
被重命名为getValue
(在升级过程中,不再直接提供值,而是提供了一个函数getValue
来评估值。此更改旨在通过仅在调用getValue()
时评估值并缓存它来提高性能。)cell: { isGrouped, isPlaceholder, isAggregated }
现在是cell: { getIsGrouped, getIsPlaceholder, getIsAggregated }
column
:基本级别的props现在是RT特定的。在定义时添加到对象中的值现在在columnDef
中更深一层。table
:传递给useTable
hook的props现在出现在options
下。flexRender()
代替cell.render('Cell')
或column.render('Header')
等。getHeaderProps
、getFooterProps
、getCellProps
、getRowProps
等都已被_弃用_。
style
或可访问性属性,如role
。这些仍然对您的正确性很重要,但为了支持框架无关性,必须将其删除。onClick
处理程序,但有新的get*Handler
辅助函数可以使此过程简单。key
propscolSpan
prop。- <th {...header.getHeaderProps()}>{cell.render('Header')}</th>+ <th colSpan={header.colSpan} key={column.id}>+ {flexRender(+ header.column.columnDef.header,+ header.getContext()+ )}+ </th>
- <td {...cell.getCellProps()}>{cell.render('Cell')}</td>+ <td key={cell.id}>+ {flexRender(+ cell.column.columnDef.cell,+ cell.getContext()+ )}+ </td>
// 在此示例中的列定义中- Header: ({ getToggleAllRowsSelectedProps }) => (- <input type="checkbox" {...getToggleAllRowsSelectedProps()} />- ),- Cell: ({ row }) => (- <input type="checkbox" {...row.getToggleRowSelectedProps()} />- ),+ header: ({ table }) => (+ <Checkbox+ checked={table.getIsAllRowsSelected()}+ indeterminate={table.getIsSomeRowsSelected()}+ onChange={table.getToggleAllRowsSelectedHandler()}+ />+ ),+ cell: ({ row }) => (+ <Checkbox+ checked={row.getIsSelected()}+ disabled={!row.getCanSelect()}+ indeterminate={row.getIsSomeSelected()}+ onChange={row.getToggleSelectedHandler()}+ />+ ),
filterTypes
(现在称为filterFns
)的函数签名已更改,因为它只返回一个布尔值,表示是否应包含该行。- (rows: Row[], id: string, filterValue: any) => Row[]+ (row: Row, id: string, filterValue: any) => boolean
此指南仍在进行中。如果您有时间,请考虑为其做出贡献!