基于vue解决大数据表格卡顿问题

news/2025/1/11 5:22:12/

点我在线体验Demo(请用电脑查看)

亲测苹果电脑,chrome浏览器无卡顿现象,其它浏览器并未测试,如遇到卡顿请备注系统和浏览器,方便我后续优化,谢谢

先看一下效果,一共1000 X 100 = 10W个单元格基本感受不到卡顿,而且每个单元格点击可以编辑,支持固定头和固定列

Github项目源代码 觉得可以就Star一下,哪里有问题也欢迎指出,感谢

解决问题核心点:根据可视区域,横向滚动加载,竖向滚动加载,控制dom数量

项目背景

笔者最近在做广告排期功能,需要进行点位预占,大的合同可能需要对多个资源排期,周期可能到几年这样,然后我们的页面交互是这样

横向每个月30个单元格,最多的3年,36个月,每行36*30=1080个单元格

竖向100个资源,总共约️10W个单元格,然后每个单元格里面会有一个输入框,一个库存总数,所以总数是20W个,内网使用,接口请求根本不是问题,可以浏览器渲染就扛不住了接口回来之后会出现几十秒的白屏,整个页面处于卡死状态

这还不算,加载出之后页面操作也是非常卡,滑动延迟严重,页面基本处于瘫痪状态

之前的功能是基于jquery开发的,项目重构用的vue,UI采用了ElementUI,ElmentUI中的表格在数据量较大是有严重的性能问题,最直接的表现就是白屏时间较长,而且会出现渲染错乱

所以就想着自己实现一个表格,解决卡顿问题

实现思路

表格拆分,动态加载

表格横向按月拆分,每个月份单独一个table,月份table外层放一个占位div,根据横向滚动位置控制展示

竖向按资源拆分,同样包裹一个占位div,按照滚动位置动态加载,始终保持dom数量上线

动态编辑,按需生成编辑输入框

不同的标签在浏览器渲染时性能是不一样的,比如input这种标签就比span等标签重许多,所以不能满屏input

方案就是点击单元格展示输入框,焦点丢失移除,此处的展示非display控制显示隐藏,而是v-if控制dom是否加载

代码分解

固定头

<div class="table-head"><div class="module"v-bind:style="{ transform: 'translateX(' + scrollLeft + 'px)' }"  v-for="(item, index) in monthData" v-bind:key="index"><table cellspacing="0" cellpadding="0"><thead><tr><td colspan="30">{{item.month}}</td></tr><tr><td width="100" v-for="(d_item, d_index) in item.days" v-bind:key="d_index"style="min-width:100px">{{d_item}}</td></tr></thead></table></div></div>
复制代码

固定列

 <div class="table-fix-cloumns"><div class="module fix-left-top"><table width="100" cellspacing="0" cellpadding="0"><thead><tr><td>位置</td></tr><tr><td>position</td></tr></thead></table></div><div class="module"  v-bind:style="{ transform: 'translateY(' + scrollTop + 'px)' }"><table width="100" cellspacing="0" cellpadding="0"><thead><tr v-for="(item, index) in projectData" v-bind:key="index"><td>{{item.name}}</td></tr></thead></table></div></div>
复制代码

表体

<div class="table-body" @scroll="tableScroll" style="height: 300px"><div class="module" style="width:3000px;"v-for="(item, index) in monthData" v-bind:key="index"><div class="content" v-if="Math.abs(index - curModule)  < 3"><div class="row"style="height:30px"v-for="(p_item, p_index) in projectData" v-bind:key="p_index"><table width="3000"v-if="Math.abs(p_index - curRow)  < 20"cellspacing="0" cellpadding="0"><tbody><tr><td @click="clickTd(p_index,item.month, d_item, $event)" v-for="(d_item, d_index) in item.days" v-bind:key="d_index"><span v-if="!originProjectData[p_index][''+item.month][''+d_item]['show']">{{originProjectData[p_index][''+item.month][''+d_item]['last']}}</span><input@blur="blurTd(p_index,item.month, d_item)"v-if="originProjectData[p_index][''+item.month][''+d_item]['show']"v-model="originProjectData[p_index][''+item.month][''+d_item]['last']"v-focus="originProjectData[p_index][''+item.month][''+d_item]['focus']"/></td></tr></tbody></table></div></div></div></div>
复制代码

经过如上优化,完美解决表格卡顿问题,但是我并没有封装组件,原因如下

·插件封装后会有很多限制,不能再用vue那种模板写法,用json传入数据,自定义内容不是很灵活
·可以根据自己的应用场景自行修改拓展,代码已经很简洁
·比较懒
复制代码

如果你有类似需求可以试一下我这个,怎么该你说了算

转载于:https://juejin.im/post/5c8e51bff265da67f51b42c6


http://www.ppmy.cn/news/666647.html

相关文章

基于Vue3+ECharts5+datav的疫情数据可视化大屏/地图项目

本项目是一个基于Vue3ECharts5datav打造的一个每日疫情数据大屏可视化开源项目&#xff1b;通过nginx部署在阿里云服务器上 效果展示 在线预览地址&#xff1a;http://lj520zz.top/ 服务器已过期 请大家动动手点点star 项目前台源码地址&#xff1a;https://github.com/qdfud…

vue大数据表格解决方案的比较

前言 近些年公司一直采用vue2.xElement UI进行开发&#xff0c;对于Element UI&#xff0c;由于起步较早&#xff0c;相关的生态一直比较成熟&#xff0c;各种问题在某度上也能找到比较完美的解决方案&#xff0c;最最重要的一点是bug也比较少。 凡是总有个但是&#xff1a;&a…

POI百万级大数据量EXCEL导出

一. 简介 excel导出&#xff0c;如果数据量在百万级&#xff0c;会出现俩点内存溢出的问题&#xff1a; 1. 查询数据量过大&#xff0c;导致内存溢出。 该问题可以通过分批查询来解决&#xff1b; 2. 最后下载的时候大EXCEL转换的输出流内存溢出&#xff1b;该方式可以通过新版…

城市POI数据爬取-百度地图版

1 API说明 目前百度地图的最新版为地图检索V2.0服务。详细介绍可以通过开发文档-web服务Api-地点检索V2.0获取。 在使用API前需要提前注册账号获取ak。对于免费账号&#xff1a;目前的每日访问次数是100次&#xff0c;最多可以获取2000条数据。 如不需讲解仅需要下载代码&am…

使用Java导出Excel表格并由浏览器直接下载——基于POI框架

目录 背景描述 技术准备 导出Excel——尝鲜版 导出Excel——封装版(通过反射) 导出Excel——深度封装&#xff08;设置下拉选项&#xff09; 扩展——多个列分别是不同的下拉选项怎么封装 2019-10-28 更新&#xff0c;必看&#xff01;&#xff01;&#xff01; 2019-1…

VUE页面表格数据多卡顿用虚拟表单

情景概况&#xff1a;页面表格想要通过滚动条展示非常多的数据&#xff0c;后端返回接口很快。 解决方法&#xff1a;虚拟滚动 vue vxe-table 20220708_145309 element ui 表单已经不能满足这个需求&#xff0c;二次封装也很麻烦&#xff0c;所以推荐用现有插件vxetable 插…

js使用百度地图仅显示中国区域,实现大数据热点图

马上又到年底PPT环节了&#xff0c;各位实现效果之后&#xff0c;麻烦留言点赞。。 需求&#xff1a;领导需要在年会上展示我们的用户ip实时数据&#xff0c;做一个网页版的地图&#xff0c;仅仅显示中国区域。 技术分析&#xff1a;echart&#xff0c;hchart等网站都有地图版…

对去哪儿旅行(功略库)的数据分析

选题背景 去哪儿旅行网站上有丰富的图片&#xff0c;旅行数据以及评论数据&#xff0c;用这些大量的数据来学习数据采集及可视化分析是一个不错的选择 网页分析 可以获取的数据 通过翻阅这些攻略我们可以观察到网站上展示了以下共有的数据&#xff1a;文章标题&#xff0c;…