项目场景:
项目场景:项目开发时遇到后端返回的数据量很大,这些数据要渲染在el-table组件中。并且没有做分页功能时,程序面临卡死和白屏的问题。
原因分析:
页面加载卡顿是前端工作中要考虑到的性能优化的问题,造成卡顿的原因有很多。例如:
(1)过多的http请求
(2)长时间占用js线程
(3)页面回流和重绘较多
(4)资源加载堵塞
(5)内存泄漏导致内存过大
(6)dom节点或事件占用内存过大
(7)长时间占用js线程
(8)资源加载阻塞
(9)页面回流和重绘较多
解决方案:
我这里涉及到的原因是页面触发了大量的重绘,一次性渲染了过多的dom元素。解决方法有很多,比如分页,使用异步组件或延迟加载,v-if 替代 v-show,虚拟滚动el-table-virtual-scroll第三方库。
我这里使用的是虚拟滚动。
首先在项目里安装el-table-virtual-scroll,npm i el-table-virtual-scroll -S
然后在需要使用的页面导入
import VirtualScroll from "el-table-virtual-scroll";
import { VirtualColumn } from "el-table-virtual-scroll";
components: {
VirtualScroll,
VirtualColumn,
},
el-table的外层加上VirtualScroll
<virtual-scroll
ref="virtualScroll"
:data="data"//所有的数据
:item-size="60"
key-prop="id" //唯一标识
@change="onChange" //计算完成真实显示的表格行数(renderData, start, end):renderData 真实渲染的数据,start和end指的是渲染的数据在总数据的开始到结束的区间范围
>
<el-table
:lazy="true"
:data="virtualList" // 计算后得到的当前可视的数据
max-height="400px"
>
<template>
<!--使用虚拟加载插件多选需要引入VirtualColumn-->
<virtual-column width="60" type="selection"></virtual-column>
<el-table-column
align="left"
label="序号"
prop="index"
width="300"
></el-table-column>
// .......省略
</template>
</el-table>
</virtual-scroll>
onChange(renderData, start, end) {
this.startIndex = start; // 需要添加startIndex,真实的index = this.startIndex + rowIndex
this.virtualList = renderData;
},