带虚拟滚动的可编辑表格组件ReVirtualEditTable

465 阅读3分钟

虚拟滚动可编辑表格ReVirtualEditTable

组件实现基于 Vue3 + Element Plus + Typescript,同时引用 vueUse + lodash-es + tailwindCss (不影响功能,可忽略)

ReEditTable 的基础上,增加虚拟滚动功能。

:::warning

虚拟滚动需要固定行高,表单控件避免使用高度会动态变化的组件。

:::

思路

由于基于ElTable组件,同时滚动容器由ElTableBody控制,因此想要控制前置内容和后置内容需要通过DOM操作才行,提供了 table-virtual 进行ElTable支持虚拟滚动的统一DOM操作方法,其中核心的虚拟滚动计算一样是基于 useVirtualScroll hook实现。

在ReEditTable渲染后,通过DOM操作在ElTableBody的滚动容器中注入前置Div节点和后置Div节节点,经过滚动计算后得到的前置高度和后置高度,更新前置Div节点和后置Div节节点 的 height 样式撑开容器。

局限

行高高度需要固定,暂不直接支持动态的行高高度,支持父组件通过指定 rowHeight 为函数动态返回行高来实现动态支持,需要父组件自行维护每行的高度,把性能问题交由父组件决定。

基础

查看 /demo/table/virtual-edit-table.md

ReVirtualEditTable属性

字段说明类型默认值
maxHeight表格高度number-
previewRows前后预加载数量,默认同 pageSizenumber-
skeleton开启css骨架屏booleantrue
pageSize虚拟滚动显示页大小number20
rowHeight行高number | ((index: number) => number)-
defaultRowHeight默认行高number-

除了上述属性之外,ReEditTable属性均支持,默认会被ReEditTable实例继承

ReVirtualEditTable事件

事件名说明格式
update:data绑定数据更新时触发(data: Record<string, any>[]) => void

除了上述事件之外,ReEditTable支持的事件也支持,默认会被ReEditTable实例继承

ReVirtualEditTable插槽

插槽名说明
empty空状态展示
toolbox-left页头工具栏左侧内容插槽,可用于自定义新增按钮
toolbox-right页头工具栏右侧内容插槽,可用于自定义附加按钮
add-bottom-button页脚新增按钮插槽,用于自定义页脚的新增按钮,只有在 showAddBtnaddBtnPosition="bottom" 时有效

除了上述插槽之外,列配置项配置的插槽也支持。如果是自定义控件,列配置需要指定插槽

ReVirtualEditTable Expose

字段说明类型
editTableRefReEditTable组件实例InstanceType<typeof ReEditTable>
maxHeight编辑表格高度number
startIndex虚拟滚动列表起始索引number
endIndex虚拟滚动列表结束索引number
toAdd增加一行() => void
toDelete删除指定行($index: number) => void
toEdit编辑指定行($index: number) => void
toEditCell编辑指定单元格($index: number, prop: string) => void
cancelEditRow取消指定行编辑状态($index: number) => void
cancelEditCell取消指定单元格编辑状态($index: number, prop: string) => void
validate整个编辑表格校验(callback?: (valid: boolean) => void) => void
validateRow指定行校验(index: number, callback?: (valid: boolean) => void) => void
validateCell指定单元格校验(index: number, prop: string, callback?: (valid: boolean) => void) => void

源代码

Github

/components/ReTable/src/virtual-editor.vue

可以通过查看具体实现,如果遇到问题可以留言或者提出issue。

如果觉得对您有帮助的话,可以请小编瑞一下

WechatIMG6.jpg

IMG_2654.JPG