进阶用法
虚拟滚动#
开关配置#
数据量较大时,表格会自动开启虚拟滚动。你也可以通过表格的 useVirtual 属性来调整虚拟滚动功能,目前 useVirtual 支持以下几个值:
- 'auto'(默认值)表示根据表格的行数或列数自动调整是否开启虚拟滚动- 行数量超过 100 时,自动开启纵向虚拟滚动
- 列数量超过 100 时,自动开启横向虚拟滚动
- 表头的横向虚拟滚动默认关闭
 
- true开启所有虚拟滚动
- false关闭所有虚拟滚动
- 传入一个对象可以分别指定 横向/纵向/表头 是否开启虚拟滚动- 对象的结构为 { horizontal?: boolean | 'auto', vertical?: boolean | 'auto', header?: boolean | 'auto' }
 
- 对象的结构为 
此外,水平方向的虚拟滚动 要求「所有的列都有一个指定的宽度」。推荐设置 <BaseTable defaultColumnWidth={...} />,确保所有的列都有一个指定的宽度
虚拟滚动与单元格合并#
在虚拟滚动开启的情况下,如果想要进行单元格合并,则要使用 column.getSpanRect 来进行设定:
- column.getSpanRect返回一个- SpanRect的对象来表示对应单元所处的合并后的位置。
- SpanRect的具体类型为- { left: number, right: number, top: number, bottom: number }- 注意其中 left/top 是 inclusive 的,right/bottom 是 exclusive 的。
 
不开启虚拟滚动时,单元格合并可以通过 column.getCellProps(...) 返回 colSpan / rowSpan 进行实现。
滚动容器(v2.4 之前)#
note
这里描述的是 v2.4 之前版本的行为,v2.4 之后已经没有 flowRoot 这个属性了,滚动容器不需要再显示地进行设置。
一般来说表格有如下两种滚动模式:
- 不限制表格容器的尺寸,表格随着整个页面发生滚动- 此时的写法: <BaseTable ... />(不设置 style.overflow,也不限制表格高度或宽度)
 
- 此时的写法: 
- 限制表格容器的尺寸,表格容器内发生滚动- 此时注意设置表格的高度或最大高度(宽度同理),并设置 style.overflow = 'auto'
- 注意 height/width/maxWidth/maxHeight 是设置在表格上的,而不是设置在父节点上:- 正确的写法:<BaseTable style={{ overflow: 'auto', maxHeight: 400 }} ... />
- 错误的写法:<div style={{ overflow: 'auto', maxHeight: 400 }}> <BaseTable ... /> </div>
 
- 正确的写法:
- 从另一个角度讲,如果为表格设置了 style.overflow = 'auto',则必须为表格设置高度或最大高度
 
- 此时注意设置表格的高度或最大高度(宽度同理),并设置 
除了以上两种滚动模式之外,如果你想让表格在指定的容器内进行滚动,可以配置 props.flowRoot,该 prop 可指定表格发生滚动的 BFC。
表格的上层元素不能设置 style.transform。上层元素中出现缩放或平移时,表格内部可能无法获取正确的 DOM 尺寸。
滚动容器(v2.4+)#
表格组件会自动向上寻找第一个滚动容器,并在该容器内发生虚拟滚动。
你可以为表格设置 styles.overflow=auto 和 styles.height = 300px(也可以设置 width、maxWidth 或 maxHeight),也可以在表格的上层某个元素上设置这些样式。如果没有设置这样样式,表格将在 window 上发生虚拟滚动。
// 滚动发生在表格内部<BaseTable style={{ overflow: 'auto', maxHeight: 400 }} />
// 滚动发生在指定的 div.scroll-container<div style={{ transform: 'scale(0.8)' }}>  <div className="scroll-container" style={{ overflow: 'auto', width: 500, height: 300 }}>    <BaseTable />  </div></div>
// 滚动发生在 window 上<html>  <body>    <h1 />    <p />    <p />    <BaseTable />    <footer />  </body></html>表格的上层元素支持设置 style.transform,可以出现简单的缩放、平移和旋转。
预估行高#
在元素被渲染在页面之前,组件是无法获取该元素的尺寸的。为了展示尽量真实的滚动条,表格组件内部需要算出所有行的高度之和。在一行没有被渲染之前,表格内部会使用 props.estimatedRowHeight (默认值为 48)来作为该行的高度,从而计算所有行的高度和。
在实际使用时,实际行高可能与预估行高有较大出入,此时可以设置 estimatedRowHeight 来提升预估高度的准确性。
锁列#
锁列的传递性#
在有列嵌套的情况下(通过 column.children 设置列的子节点,形成列的嵌套结构),锁列具有传递性:
- 如果一个父节点设置了锁列 lock=true,则其所有子节点将自动被设置为lock=true
- 如果一个节点设置了锁列 lock=true,则其父节点和所有祖先节点将被设置为lock=true
此外,如果所有的列都设置了 lock=true,则整个表格的锁列将不生效。
左侧锁列 or 右侧锁列#
锁定方向 取决于该列在 columns 中的下标:
- 下标为 0, 1, 2, ... 左侧锁定
- 下标为 n-1, n-2, n-3, ... 右侧锁定
getValue 与 render#
column.getValue 与 column.render 都会影响到单元格的渲染内容,但两者有「语义」上的区别:
- column.getValue用于自定义取数方法- 默认的取数方法为 row => row[column.code]
- getValue 的返回值应当是一个可被序列化的值,该返回值将作为「单元格的值」
 
- 默认的取数方法为 
- column.render用于自定义单元格的渲染方法- render 可以返回 ReactNode 以在页面上渲染更加丰富的元素
 
导出表格数据时,「单元格的值」将会导出至 excel 或 json 文件。
components 替换#
表格内部用到一些子组件来实现加载动画、空表格展现效果等,上层可以通过 props.components 覆盖内部的默认子组件,实现一些自定义的效果。
目标表格支持的自定义子组件较少,列表如下:
- LoadingIcon自定义加载图标
- EmptyContent数据为空时表格的展示内容
- LoadingContentWrapper自定义表格内容的 wrapper div,可用于实现自定义的加载效果