0Pricing
React Academy · 课时

行选择与虚拟化表格

添加复选框行选择,并将 TanStack Table 与 TanStack Virtual 结合以渲染大型数据集

行选择与虚拟化表格 是 CoddyKit 上的免费 React Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

启用行选择

使用 id 为 'select' 的选择列,将其添加到您的 ColumnDef 数组中。单元格会渲染一个连接到 row.getToggleSelectedHandler() 的复选框。标题会使用 table.getToggleAllRowsSelectedHandler() 渲染一个全选复选框。

此外,还要将 rowSelection 状态和 onRowSelectionChange 传递给 useReactTable。

检查选择状态

当某行当前处于选中状态时,row.getIsSelected() 会返回 true,非常适合为选中的行应用高亮背景样式。

当一个组中只有部分行被选中时,row.getIsSomeSelected() 可以处理复选框的不确定状态,这对分组表格很有用。

获取选中的行

table.getSelectedRowModel().rows 会返回一个数组,其中包含当前选中的所有行对象。每一行都有一个 row.original 属性,其中包含原始数据对象。

您可以据此构建针对选中集合执行操作的批量操作按钮,例如“删除所选项”或“导出所选项”。

批量操作界面模式

根据 table.getSelectedRowModel().rows.length > 0 有条件地渲染操作按钮。未选中任何行时,请隐藏或禁用批量操作工具栏,以免用户面对令人困惑的空状态操作。

在界面中显示选中数量:“已选中 {count} 行”,让用户随时了解当前选择。

为什么要对表格进行虚拟化?

将 10,000 行渲染为 DOM 节点会非常缓慢。浏览器必须对数千个元素进行布局、绘制和维护,用户会遇到卡顿的滚动效果以及缓慢的初始渲染。

虚拟化只会渲染当前视口中可见的行,从而大幅减小 DOM 规模并提升性能。

安装 TanStack 虚拟化

请将 @tanstack/react-virtual 与 @tanstack/react-table 一起安装。这两个库彼此独立,但专门设计为相互配合使用。TanStack 表格负责管理数据逻辑;TanStack 虚拟化负责管理哪些项目会被渲染到 DOM 中。

两者的集成点是 table.getRowModel().rows 返回的行数组。

设置 useVirtualizer

请调用 useVirtualizer({ count: table.getRowModel().rows.length, getScrollElement: () => tableContainerRef.current, estimateSize: () => 35 })。count 决定虚拟项目的数量,使其与当前表格在应用所有筛选后的行数一致。

estimateSize 提供初始行高估值;行渲染后会测量实际高度。

渲染虚拟项目

调用 virtualizer.getVirtualItems(),即可获取当前应该位于 DOM 中的行。遍历该数组,通过 table.getRowModel().rows[virtualRow.index] 访问实际行,然后只渲染这些 tr 元素。

每个虚拟项目都有一个 start 属性,用于在滚动容器中进行绝对定位。

填充间隔 div

为了保持正确的滚动位置,请添加一个顶部间隔 div,其高度等于第一个虚拟项目的 start;再添加一个底部间隔 div,其高度等于总大小减去最后一个项目的结束位置。

这些不可见的 div 会填充未渲染行本应占据的空间,使滚动条比例保持正确。

使用 measureElement 动态测量行高

将 measureElement: el => el.getBoundingClientRect().height 传递给 useVirtualizer,以准确获取动态行高。每一行的引用都会附加到 tr 元素上,以便虚拟化器测量其实际渲染高度。

这样即可处理内容高度不同的行(多行文本、展开的行),而不会发生布局偏移。

组合所有功能

TanStack 表格的排序、筛选、分页、行选择和 TanStack 虚拟化可以组合使用。传递给 useVirtualizer 的行数应来自 table.getRowModel().rows,此时所有处于启用状态的行模型都已处理完数据。

启用分页后,应先进行分页,再对当前页面的行进行虚拟化,从而在较大的页面中实现平滑滚动。

TanStack 表格行选择

哪个方法会返回当前所有选中行的原始数据对象?

课程回顾

行选择使用带有 getToggleSelectedHandler 的复选框列、rowSelection 状态,以及用于访问选中数据的 table.getSelectedRowModel().rows。使用 useVirtualizer 进行虚拟化时,会通过 getVirtualItems、间隔 div 和可选的 measureElement,只渲染可见行。

TanStack 表格的所有功能(排序、筛选、分页和选择)都可以与虚拟渲染整洁地组合。

常见问题解答

「行选择与虚拟化表格」课时是免费的吗?

是的 — 「行选择与虚拟化表格」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「行选择与虚拟化表格」这节课中我会学到什么?

添加复选框行选择,并将 TanStack Table 与 TanStack Virtual 结合以渲染大型数据集 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「行选择与虚拟化表格」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 React Academy 课中编写并运行代码吗?

能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. TanStack Table 理念与无头设计
  2. 定义列并渲染行
  3. 排序、筛选与分页
  4. 行选择与虚拟化表格
← 返回 React Academy