基于antd Table封装表格性能优化

基于antd Table封装表格性能优化

原始需求

1、支持自定义封装的基础控件在表格中展示。
2、实现一个受控的表格组件
3、实现单元格层级的校验功能,包括必填和自定义规则的校验。
4、支持自定义事件。依据配置项为click、focus、blur、change等类型事件添加自定义事件触发钩子。
5、支持自定义属性。实现行、列、单元格层级的自定义属性配置。
6、支持500行*20列表格正常使用不卡顿

分析

  基于以上几点需求,无法利用现有的UI框架提供支持,同时为增加可扩展性,也只有自己封装一个表格了。

  • 首先考虑的是antd 的 table,可以基于 components 实现自定义 header、row、cell,实现按列甚至单元格的控件展示逻辑。
  • 通过结合 form 可以实现单元格层级的校验。
  • 对于受控和自定义事件、属性,通过额外的代码逻辑也可以实现。
  • 但当测试 500行*20列数据时,发现滚动和输入都存在明显卡顿问题。

问题处理

一、表格滑动卡顿问题

分析

  因 antd Table 底层采用 rc-table,会为 cell 注入 onMouseEnter/onMouseOut 事件,用于鼠标滑动时使所在行高亮,原理是操作 dom 添加/删除 classname。因此在表格上下滚动过程中会不断操作 dom 触发重绘影响性能
在这里插入图片描述
  去除自动注入的 onMouseEnter/onMouseOut 事件实现的行高亮样式后。滚动时卡顿明显改善。但是行 hover 高亮却没有了(通过 :hover 实现的背景色效果还在,如果需要行高亮可以通过覆盖该背景色的方式实现)。
在这里插入图片描述

<

Ant Design 是一个非常流行的 UI 框架,它提供了很多实用的组件,包括 Table 表格组件。在 Vue 项目中使用 Ant Design 的 Table 组件时,可以考虑封装一个通用的 Table 组件,方便在不同的页面中复用。 下面是一个简单的 Ant Design Vue Table 封装: ```vue <template> <a-table :columns="columns" :dataSource="dataSource"> <a-pagination :total="total" :current="current" :pageSize="pageSize" @change="handlePageChange" /> </a-table> </template> <script> import { Table, Pagination } from 'ant-design-vue'; export default { name: 'AntdTable', components: { Table, Pagination }, props: { columns: { type: Array, required: true, }, dataSource: { type: Array, required: true, }, total: { type: Number, required: true, }, current: { type: Number, required: true, }, pageSize: { type: Number, required: true, }, }, methods: { handlePageChange(pageNumber) { this.$emit('page-change', pageNumber); }, }, }; </script> ``` 在这个组件中,我们使用了 Ant Design Vue 提供的 Table 和 Pagination 组件。组件接受了五个 props:columns、dataSource、total、current 和 pageSize,分别对应 Table 组件和 Pagination 组件的属性。在 handlePageChange 方法中,我们触发了一个自定义事件 page-change,这个事件可以在父组件中监听并处理分页请求。 使用这个组件时,只需要传入相应的 props 即可: ```vue <template> <div> <AntdTable :columns="columns" :dataSource="dataSource" :total="total" :current="current" :pageSize="pageSize" @page-change="handlePageChange" /> </div> </template> <script> import AntdTable from '@/components/AntdTable'; export default { components: { AntdTable }, data() { return { columns: [...], dataSource: [...], total: 100, current: 1, pageSize: 10, }; }, methods: { handlePageChange(pageNumber) { console.log('Page changed:', pageNumber); }, }, }; </script> ``` 这样,我们就完成了一个简单的 Ant Design Vue Table 封装
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值