前言
vue渲染小数据挺快,大数据vue开始出现卡顿现象,本文讲给大家详细介绍关于vue大数据表格卡顿问题的解决方法
点我在线体验Demo(请用电脑查看)
亲测苹果电脑,chrome浏览器无卡顿现象,其它浏览器并未测试,如遇到卡顿请备注系统和浏览器,方便我后续优化,谢谢
先看一下效果,一共1000 X 100 = 10W个单元格基本感受不到卡顿,而且每个单元格点击可以编辑,支持固定头和固定列
项目源代码地址 Github (本地下载)
解决问题核心点:横向滚动加载,竖向滚动加载
项目背景
笔者最近在做广告排期功能,需要进行点位预占,大的合同可能需要对多个资源排期,周期可能到几年这样,然后我们的页面交互是这样
横向每个月30个单元格,最多的3年,36个月,每行36*30=1080个单元格
竖向100个资源,总共约"color: #ff0000">实现思路
表格拆分,动态加载
表格横向按月拆分,每个月份单独一个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传入数据,自定义内容不是很灵活
·可以根据自己的应用场景自行修改拓展,代码已经很简洁
·比较懒
如果你有类似需求可以试一下我这个,也欢迎Star
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
vue卡顿,vue大数据表格卡顿
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 群星.2015-华丽上班族电影原声大碟【大右音乐】【WAV+CUE】
- 陈粒《乌有乡地图》[320K/MP3][21.81MB]
- 陈粒《乌有乡地图》[FLAC/分轨][398.39MB]
- 刘雨昕《2023 XANADU TOUR LIVE原创作品合集》[320K/MP3][26.73MB]
- BEYOND《永远等待25周年限量版》香港盒装版5CD[WAV+CUE]
- 群星《2018年度最佳发烧男声》2CD/DTS[WAV]
- 群星《2018年度最佳发烧女声》2CD/DTS-ES[WAV]
- 刘雨昕《2023 XANADU TOUR LIVE原创作品合集》[FLAC/分轨][134.18MB]
- 李梦瑶《瑶不可及(DSD)》[WAV+CUE][1.1G]
- 群星《2022年度抖音新歌》黑胶碟2CD[WAV+CUE][1.6G]
- 方伊琪.2008-不一样的方伊琪【风行】【WAV+CUE】
- 谭咏麟.2023-爱情陷阱(MQA-UHQCD限量版)【环球】【WAV+CUE】
- 群星.2012-尝味·人生-百味华语作品集2CD【环球】【WAV+CUE】
- 童丽《绝对收藏·贰》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]
- 阿梨粤《难得有情人》头版限量编号HQⅡ [WAV+CUE][1.1G]