element中el-table大数据量渲染卡顿问题

最终实现效果
在这里插入图片描述

1、业务描述
在开发过程中,一个表格需要无分页展示出几万条的数据。并且表格有几十甚至一百多列。
2、现象及问题原因
正常使用el-table渲染表格页面直接卡死。
一次性渲染了几万条,几十列,造成大量DOM一次性渲染,直接造成至使页面卡死。
曾尝试使用组件unmy-ui解决卡顿问题,但效果不显著…
3、解决方案
采用数据结合盒子滚动实现数据动态滚动效果。
思路:动态替换可视区域的数据。
我所写的案例是默认展示十条,接下来按十条描述。
主体内容显示部分:页面默认进入显示的是第一个十条,也就是索引的[0,9]。当盒子滚动的时候滚动了一行默认显[1,10],两行[2,11]…以此类推。
这个位置永远都是只展示十条。在这里插入图片描述
滚动盒子:计算出来当前所有数据的高度(为了方便计算行高默认相同,案例中行高45px),以便于撑起来盒子高度,显示滚动条。

ps:目前存在一个问题,鼠标必须在滚动条的盒子上移动才会有效果。这个有待研究…

画了一图展示下层叠关系
在这里插入图片描述
如果使用触底懒加载方式,也会因为DOM加载过多造成页面卡顿。
4、代码部分
代码很全也很简单,运行一下就能看明白。滚动向上滚动向下都能根据位置自动显示对相应数据。

<template>
  <div class="box">
     <!-- false-box这是一个用来显示滚动条的方法 -->
    <div class="false-box"> 
      <div class="scroll-box" :style="{'height': scollBoxHeight + 'px'}">
       <!-- scroll-box是用来撑起盒子的方法 -->
      </div>
    </div>
    <div class="table-box">
      <el-table
        :data="tableData"
        style="width: 100%">
        <el-table-column
          prop="date"
          label="日期"
          width="180">
        </el-table-column>
        <el-table-column
          prop="name"
          label="姓名"
          width="180">
        </el-table-column>
        <el-table-column
          prop="address"
          label="地址">
        </el-table-column>
      </el-table>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      allData:[],
      tableData: [],
      elTableHeight: '',  //el-table的高度
      theadHeight: '',  //表头的高度
      contentHeight: 0, //主要内容高度
      showRowCount: 0, //一共能显示多少行 
      falseBox: 0,  //后边假盒子的高度
      scollBoxHeight: 0, //假滚动条的高度
      scrollTopRowCount: 0, //一共向上滚动了多少行
    }
  },
  mounted() {
    let that = this;
    // 模拟一万条假数据
    for(let i = 0; i < 10000; i++) {
      this.allData.push({
        date: i+ 1,
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      })
    }
    this.scollBoxHeight = 45 * this.allData.length + 45; //多加一行,要不然滚动到底差一行
    this.$nextTick( () => {
      this.elTableHeight = document.querySelector('.table-box .el-table').offsetHeight;
      this.theadHeight = document.querySelector('.table-box .el-table__header-wrapper').offsetHeight;
      this.contentHeight = this.elTableHeight - this.theadHeight;
      this.showRowCount = Math.floor(this.contentHeight / 45);
      // 获取默认显示的前 <showRowCount> 条
      this.tableData = JSON.parse(JSON.stringify(this.allData)).splice(0,this.showRowCount);
    })
    this.falseBox = document.querySelector('.false-box');
    this.falseBox.addEventListener('scroll', function(e) {
      that.scrollTopRowCount =  Math.ceil(e.target.scrollTop / 45);
      // 获取从索引<scrollTopRowCount> 开始 <showRowCount> 条
      that.tableData = JSON.parse(JSON.stringify(that.allData)).splice(that.scrollTopRowCount, that.showRowCount);
    });
  },
}
</script>
<style lang="scss" scoped>
.box {
  width: 1000px;
  height: 500px;
  overflow: hidden;
  position: relative;
  .false-box {
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0%;
    left: 0%;
    overflow: auto;
    .scroll-box {
      width: 100%;
      height: 1000px;
      position: absolute;
    top: 0%;
    left: 0%;
    }
  }
  .table-box {
    width: calc(100% - 20px);
    height: 100%;
    position: absolute;
    top: 0%;
    left: 0%;
  }
}
::v-deep .el-table {
  width: 100%;
  height: 100%;
  .el-table__row {
    height: 45px;
    td {
      padding: 0px 
    }
  }
}
</style>
  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
### 回答1: el-tableVue.js 的一个组件,用于渲染数据的列表。要支持大数据渲染,可以使用一些优化技术来提高渲染的效率。具体来说,可以使用以下方法: 1. 开启表格的虚拟滚动功能,可以通过设置 `virtual-scroll` 属性为 `true` 来开启。虚拟滚动功能可以避免同时渲染所有数据,只渲染当前可见区域的数据,可以大幅提升渲染性能。 2. 使用缓存策略,可以通过设置 `data` 属性的第二个参数(缓存策略)来控制缓存的行数。当行数较多时,可以通过设置缓存策略为 `keep-alive` 或 `session` 来缓存一部分数据,避免频繁地渲染所有数据。 3. 使用分页功能,可以通过设置 `pagination` 属性为 `true` 来启用分页功能。分页功能可以将数据分成多个页,每次只渲染当前页的数据,可以有效减少渲染数据的数。 4. 使用高级绑定,可以通过设置 `lazy` 属性为 `true` 来启用高级绑定。高级绑定可以在数据发生变化时自动更新表 ### 回答2: el-table组件可以通过以下几种方式来支持大数据渲染: 1. 虚拟滚动:el-table可以使用虚拟滚动来渲染大数据。通过设置表格的高度和设置属性`:virtual-scroll`为true,可以启用虚拟滚动功能。这样只会渲染当前可见区域的数据,大大提高了渲染的效率。 2. 分页加载:对于大数据的表格,可以分页加载数据。通过设置`pagination`属性来启用分页,并且可以定义每页显示的数据条数,例如每页显示10条数据,这样可以减少一次性渲染数据的压力。 3. 异步加载数据:如果数据非常大,可以考虑使用异步加载数据的方式。可以通过监听表格的滚动事件或者分页切换事件,当滚动到可见区域的边缘或者切换到下一页时,通过发送异步请求来获取数据渲染到表格。这样可以避免一次性加载大数据造成的性能问题。 4. 数据过滤和排序:el-table提供了数据过滤和排序的功能,可以根据需要对大数据进行筛选和排序,这样可以提高用户查找数据的效率。 总的来说,el-table可以通过虚拟滚动、分页加载、异步加载数据数据过滤排序等方式来支持大数据渲染,从而提高渲染效率和用户体验。 ### 回答3: el-tableElement UI的一种表格组件,可以很方便地展示和处理数据。对于大数据渲染,可以通过以下几种方式来提高渲染性能和减少内存占用。 1. 虚拟滚动:el-table提供了一种虚拟滚动的方式来支持大数据渲染。虚拟滚动只会渲染可视区域内的数据,而不会将所有数据渲染页面上。这样可以大大减少页面渲染的时间和内存占用。 2. 分页加载:将大数据集分页加载可以有效减少页面渲染负担。el-table组件可以通过配置分页参数来实现分页加载数据,每次只加载当前页的数据,而不会一次性加载所有数据。 3. 后端数据加载:对于大数据渲染,推荐使用后端分页加载的方式。即每次只向后端请求当前页的数据,减少前端数据处理的压力。 4. 动态渲染el-table组件提供了"lazy"属性,可以实现渲染某个区域的数据时,只渲染当前可见区域之前和之后的一定数数据,而不是渲染整个数据集。这样可以提高页面加载速度和渲染性能。 5. 使用slot:el-table还提供了自定义列的功能,可以通过使用slot来渲染行或列的内容,减少不必要的渲染。只渲染需要展示的数据,而不是将所有数据渲染页面上。 综上所述,el-table可以通过虚拟滚动、分页加载、后端数据加载、动态渲染和使用slot等方式来支持大数据渲染,提高渲染性能和减少内存占用。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值