Element-UI表格el-table组件渲染大量数据卡顿问题的解决方案

 7925

我们知道操作dom会引起页面的重绘重排。数据量过多导致浏览器渲染过多的标签元素,频繁的重绘重排导致DOM树占用内存较大使得用户操作阻塞。element-ui中的el-table组件在大数据的渲染上也是差强人意。对于动态数据想要不重新渲染是不可能的,那么只能让他去少渲染。

经过多方测试最终选择了pl-table这个组件。它的实现原理是创建了一个虚拟的x轴和Y轴,通过监听滚动每次只渲染可视区域的数据。官方的文档只有属性介绍对新手不算友好,特别是筛选与合计部分基本没有说,下面就手摸手的教会大家如何使用。

项目地址:

https://github.com/livelyPeng/pl-table


大数据渲染组件pl-table使用说明

一,基础使用

1、引入组件

  1. // main.js中引入样式文件
  2. import 'pl-table/themes/index.css'
  3. // 局部引入组件
  4. import { PlTable, PlTableColumn } from 'pl-table'
  5. components: {PlTable,PlTableColumn}
  6. // 全局引入组件,在mian.js中
  7. import plTable from 'pl-table'
  8. Vue.use(plTable);

两者选择一种即可,我使用的是局部引入


2、替换原el-table,el-table-column组件名

  1. el-table 替换为 PlTable
  2. el-table-column 替换为 PlTableColumn


3、为PlTable组件增加如下属性:

  1. use-virtual   // 开启虚拟渲染
  2. :height="tableHeight" // 表格的高度
  3. :row-height="35" // 表格每行的高度

注意:假如你的tableHeight和我一样是计算得来,请在PlTable上增加高度判断v-if=”tableHeight>0″。因为该组件必须建立在有固定高度及行高的情况下才可生效。


二,字段筛选

注:(如果不需要字段筛选,请忽略本段内容,实测有一些小bug存在)

1、在data中声明一个空数组(该数组长度等于你的字段个数)

如:

  1. data() {
  2.   return {
  3.     columnVisibles:new Array(37).fill(true),
  4.   }
  5. }

2、为PlTable组件增加如下属性:

  1. ref="data-table"
  2. :dialog-data="tableColumnTitleData" // 筛选的列名
  3. @show-field="showFields" // 触发筛选事件

tableColumnTitleData 数据格式如下

  1. tableColumnTitleData: [
  2.   { name: '复选框', state: true, disabled: true }, // state: true 选中状态 | disabled: true 是否禁用
  3.   { name: '序号', state: true, disabled: true },
  4.   { name: '姓名', state: true },
  5.   { name: '年龄', state: true },
  6.   { name: '性别', state: true },
  7. ]

3、打开筛选弹窗

可以增加一个按钮,调用如下方法即可

  1. this.$refs['data-table'].plDialogOpens()

4、触发筛选,回调参数为tableColumnTitleData的当前值,拿到该值后可对表格字段进行显隐操作(不限于我提供的方式)

比如:

  1. showFields(fields) {
  2.   this.tableColumnTitleData = fields
  3.   this.columnVisibles = []
  4.   this.tableColumnTitleData.forEach(item => {
  5.     this.columnVisibles.push(item.state)
  6.   })
  7. }

5、对表格字段进行显隐操作

如:

  1. <PlTableColumn
  2.   v-if="columnVisibles[2]"
  3.   prop="name"
  4.   label="姓名"
  5. />


三,底部合计

注:(如果不需要合计,请忽略本段内容)

为PlTable组件增加如下属性:

  1. show-summary // 开启合计
  2. :summary-method="summaryMethod" // 自定义合计方法,用法请参考el-table文档

比如:

  1. summaryMethod({ columns, data }) {
  2.   const combined = [] // 合计
  3.   columns.forEach((column, columnIndex) => {
  4.     if (columnIndex === 0) {
  5.       combined.push('合计')
  6.     } else {
  7.       switch (column.label) {
  8.         case '年龄':
  9.           combined[columnIndex] = this.sumAge // 我这里是已经统计好了直接赋值的,请根据自己业务调整
  10.           break
  11.         default:
  12.           combined[columnIndex] = ''
  13.       }
  14.     }
  15.   })
  16.   // 返回一个二维数组的表尾合计
  17.   return [combined]
  18. }

最后:感谢pl-table作者的付出,与人玫瑰手有余香。


本文网址:https://www.zztuku.com/index.php/detail-12406.html
站长图库 - Element-UI表格el-table组件渲染大量数据卡顿问题的解决方案
申明:如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐