超大表格组件滚动渲染优化

60 篇文章 2 订阅
订阅专栏

引用自 摸鱼wiki

背景

业务中需要渲染一个最多有100+列的表格,由于表格使用原生dom实现,因此会出现同屏有近1000个单元格同时绘制,在快速滑动时页面会产生卡顿,影响用户体验。

方案

如下图所示,由于用户显示屏区域有限,实际上并不能同时看见超大表格的所有列,因此可以考虑虚拟滚动的设计思路,仅渲染用户可视区域内的单元格及其内容,区域外的尽可能减少渲染。

于是可以考虑把表格拆分成三个区域:

  1. 可视区域:即图中绿色标注单元格,这部分单元格用户可见,必须完整渲染
  2. 缓冲区域:即图中蓝色标注单元格,这部分单元格用户不可见,但在用户左右快速滑动时有可能可见,因此可以进行预渲染
  3. 隐藏区域:即图中红色标注单元格,这部分单元格用户不可见,且在一般情况下会一直保持不可见状态,因此可以省略其渲染

在这里插入图片描述
针对上述三种单元格类型,可以有对应三种渲染策略:

  1. 可视单元格:正常渲染
  2. 缓冲单元格:正常渲染
  3. 隐藏单元格:相邻单元格合并成一个大的空白div(图中的紫色单元格),拼接在两端,由于是一个空白div,因此渲染性能损耗极低

通过上述方法可以看到,原本一个12列的表格,在渲染的时候仅会渲染10列,包含6列可视区+2列缓冲区 + 2列填充区(消耗几乎为0),理论渲染效率提高15%-30%。由于用户视口大小是固定的,因此无论表格有多少列,同时都只会有10列单元格在实时渲染,列数越多则性能提升越大。

实施

1. 使用IntersectionObserver监听表头

new IntersectionObserver(
  (entries) => {
    let isChange = false;
    entries.forEach((e) => {
      const columnKey = e.target.getAttribute('column-key');
      if (!columnKey) return;
      if (e.intersectionRatio > 0.0) {
        this.visibleHeader.add(columnKey);
        isChange = true;
      } else {
        isChange = true;
        this.visibleHeader.delete(columnKey);
      }
    });
    if (isChange) {
      this.visibleHeaderChange.value = Date.now();
    }
  },
  {
    root,
    threshold: [0, 1],
  },
);

2. 计算前后空白宽度拼接行渲染数据

const displayCols = []
// 可视区域
for (const col of this.visibleHeader) {
	displayCols.push(col);
}
// 缓冲区域
displayCols.unshift(prevCacheCol);
displayCols.push(nextCacheCol);
// 不可见区域
displayCols.unshift(prevEmptyCol);
displayCols.push(nextEmptyCol);

3. 使用ResizeObserver监听行高变化

由于横向虚拟,行高仅与可视区+缓冲区的单元格相关,来回滚动时可能会导致行高发生变化导致抖动,因此需要给行元素添加resize监听,获取最大行高并记录,减少横向滚动的抖动

new ResizeObserver((entries) => {
  entries.forEach((entry) => {
    const rowKey = entry.target.getAttribute('data-id');
    if (!rowKey) return;
    const { height } = entry.contentRect;
    row.height = max(height, row.height)
  });
});

效果

设备:MacBook M1Pro + 120Hz高刷屏
数据量:单表90列数据

改造前:
在这里插入图片描述
改造后:
在这里插入图片描述

vue渲染大量数据如何优化_Vue - Table表格渲染上千数据优化
weixin_39834788的博客
12-29 1747
这次项目经验会谈谈经常在项目中,针对成千上万数据渲染优化的不断探索来谈谈自己的体会,其目的就是保证用户浏览上万条数据的时候,UI要很流畅,确保用户操作过程中不会出现UI卡顿或者最糟糕的情况,直接浏览器奔溃。其优化目录如下,由于内容很多,会分两篇文章进行研究,本文章主要会围绕如何设计一个虚拟滚动渲染成千上万的数据。1.表格布局(To be continue)2.Reflow & Repai...
vue elementUI table表格数据 滚动懒加载的实现方法
01-19
vue+elementUI table表格展示数据,当数据很多的时候,不能一页显示完,同时一次请求数据量太大,会增加网页渲染的时间,影响体验, 这个时候常常有两种方法处理, 1、分页,如下   2、如果我不想分页,又想在一页...
el-table 可编辑表格大数据渲染性能优化
weixin_45549481的博客
01-08 3135
el-table 可编辑表格大数据渲染性能优化
element Table表格组件渲染不分页数据滚动加载不分页数据
qq_41623635的博客
04-25 1275
【代码】Vue el-table渲染不分页数据滚动加载不分页数据。
vue大数据量列表渲染性能优化:虚拟滚动原理
最新发布
felix_alone2012的博客
08-01 674
前面咱完成了自定义JuanTree组件各种功能的实现。在数据量很大的情况下,我们讲了两种实现方式来提高渲染性能:前端分页和节点数据懒加载。关于扁平化结构Tree和嵌套结构Tree组件渲染嵌套结构的Tree组件是一种递归渲染,性能上比起列表结构的v-for渲染比较一般。对于这种渲染方式,在数据量很大的情况下,只有通过懒加载可以提高渲染性能;而扁平化结构则有更多的选择,前端分页是一种方式,还有一种更好的选择,就是本节介绍的虚拟滚动
elementui里的table表格组件大数据渲染严重的性能卡顿问题
.伊泽瑞尔
04-19 3349
elementui里的table表格组件在面对大数据量的时候渲染会出现严重的性能卡顿问题
Element ui 表格渲染太慢怎么优化?
loulansd的博客
06-23 4376
表格数据太多渲染太慢怎么优化?
python tkinter滚动Frame组件+表格组件
2201_75335496的博客
06-28 941
python tkinter滚动Frame组件+表格组件-制作
前端性能优化 - 虚拟滚动
Xxxxxl17的博客
10-24 1251
虚拟滚动:在有限的视口中只渲染我们所能看到的数据,超出视口之外的数据就不进行渲染,可以通过计算可视范围内的单元格,保证每一次滚动渲染的DOM元素都是可以控制的
uniapp:mosowe-table高级表格组件
mosowe
04-15 3386
演示地址 下载地址为偷懒而开发:uni-table uni-pagination mosowe-form mosowe-dropdown参考的nameConfig配置,其中col,hide,visible配置无效
一种优化Vue前端表格组件渲染性能的方法及系统.pdf_文档整理可打印.zip
07-13
"一种优化Vue前端表格组件渲染性能的方法及系统.pdf_文档整理可打印.zip"这个文件很可能提供了关于如何提升Vue表格组件渲染效率的策略和实践。 首先,Vue的核心特性之一是虚拟DOM(Virtual DOM),它通过比较新旧...
canvas 绘制的 vue 表格组件,解决上万行+多列数据渲染问题,集成大部分表格功能.zip
01-04
综上所述,“canvas绘制的vue表格组件”是一种创新的解决方案,它结合了canvas的高性能渲染能力和Vue的组件化思想,为处理大规模数据提供了新的可能性。在实际开发中,这样的组件可以显著提高用户体验,减少页面加载...
用于在vxetable表格中适配antdesignvue组件渲染
08-10
1. **VxeTable**:VxeTable是一个基于Vue的高性能表格组件,它支持动态列、行操作、表头分组、合并单元格、树形数据、拖拽排序、多级表头、虚拟滚动等复杂功能。通过其灵活的API和自定义渲染函数,开发者可以轻松地...
Vue列表页渲染优化详解
08-29
Vue列表页渲染优化是提高Web应用性能的关键技术之一,特别是在处理大量数据时。Vue.js通过其响应式系统自动追踪数据变化,但这可能导致不必要的DOM更新,尤其是在渲染列表时。以下是一些针对Vue列表页渲染优化策略...
使用father打包发布前端工具库
ZTao-z的博客
03-20 8812
father库说明 GitHub:https://github.com/umijs/father 安装 yarn add father 项目配置 0、项目结构 1、配置fatherrc.js 2、配置src/index.js 3、配置components/index.tsx 4、运行:father build 运行后项目文件夹内会生成一个es文件目录,里面就是打包好的代码库 发布代码包 (1)发布到私有GitHub仓库 // 正常的git提交代码 git add . git commit ""
Nginx配置运行vue项目
ZTao-z的博客
09-15 6089
1、构建 Vue 项目 在项目根目录运行npm run build命令,该命令会将该项目内的代码文件打包到dist文件夹内 2、服务器安装 Nginx 这部分网上教程很多,可以自行查找 有空再更 3、配置 nginx.conf 建议复制一份nginx.conf的副本 (1)移动到nginx的安装目录,作者的目标路径为/etc/nginx (2)使用cp nginx.conf custom.conf...
实现检测用户一段时间内无操作,自动退出登录功能(网页端)
ZTao-z的博客
09-15 5409
本项目使用vue-cookies存储用户信息(vue-session同理),在检测到用户无操作5分钟后调用logout函数进行用户登出操作。 部分函数使用Element-UI的接口,如this.$confirm等。 // App.vue <template> <div id="app"> <router-view/> </div> &...
Vue通过CDN方式引入Monaco代码编辑器
ZTao-z的博客
05-22 4756
Monaco-editor是VS Code官方使用的代码编辑器,相关可以通过链接到GitHub上去看,通常的使用方式是用npm install的方式引入,但是编辑器体积过大,加载过慢,因此就想着把它转为CDN的方式引入 public/index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compa
完成简易表格组件,具备虚拟滚动功能
03-30
抱歉,作为AI语言模型,我无法直接提供代码。但我可以提供一些思路和建议,帮助您完成这个任务。 首先,需要明确表格的样式和数据格式。假设表格每行有固定的高度,每列有固定的宽度,并且表格的数据是一个二维数组。 接下来,需要实现虚拟滚动功能。虚拟滚动是指只渲染可视区域内的数据,而不是一次性渲染整个表格。这样可以减少页面渲染的负担,提高页面性能。具体实现方法如下: 1. 计算可视区域内可以显示多少行和列。 2. 根据可视区域内的行和列,计算需要渲染的数据的起始行和列。 3. 根据起始行和列,渲染可视区域内的数据。 4. 监听滚动事件,当滚动到新的可视区域时,重新计算需要渲染的数据,更新表格。 最后,实现表格组件的交互功能,如点击排序、编辑等功能。 希望这些思路和建议能够帮助您完成这个任务。
写文章

热门文章

  • 分页存储管理系统中内存有效访问时间的计算 29748
  • MD5加密算法(C++版) 11002
  • Nodejs与Mysql交互实现(异步写法,同步写法) 8877
  • 使用father打包发布前端工具库 8812
  • 五子棋AI算法简易实现(一) 7356

分类专栏

  • 前端 60篇
  • AI绘图 1篇
  • 五子棋AI实现 7篇
  • 操作系统 1篇
  • LeetCode题解 23篇
  • 工具和插件 12篇
  • 服务计算 8篇
  • 各种报错解决方案 7篇
  • Web安全 4篇
  • 计算机视觉 3篇
  • 环境配置 5篇
  • 计算机图形学 3篇
  • 学习笔记 11篇

最新评论

  • 分页存储管理系统中内存有效访问时间的计算

    ZTao-z: 查快表的e是固定的,a是说数据在快表里的概率

  • 分页存储管理系统中内存有效访问时间的计算

    weixin_50789944: 请问(2)中为什么不是a* (e+t)而是e+a*t?

  • 分页存储管理系统中内存有效访问时间的计算

    weixin_50789944: 非常好答案,使我的思路干净

  • 随机森林回归算法(CART决策树)【numpy版】

    ZTao-z: n_jobs=1和单进程差不多

  • 随机森林回归算法(CART决策树)【numpy版】

    萌夫♛: 你好,请问这个多进程如何调为单进程

大家在看

  • 【成品论文】2024年华为杯研赛C题28页二等奖成品论文(后续会更新)

最新文章

  • 画一个不可以消失的水印
  • 跨环境前端组件库打包方案(node+esm)
  • 大数据表单元格批量请求优化方案
2024年3篇
2023年9篇
2022年19篇
2021年10篇
2020年16篇
2019年52篇
2018年43篇
2016年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZTao-z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

玻璃钢生产厂家静安区正宗玻璃钢雕塑安庆景观玻璃钢雕塑定做价格商场新媒体美陈云南石雕雕塑玻璃钢九江抽象玻璃钢雕塑葫芦岛玻璃钢雕塑制作安装玻璃钢人物雕塑制造公司兴国玻璃钢雕塑浙江特色玻璃钢雕塑价位玻璃钢卡通雕塑的评语怎么写白云区玻璃钢人物雕塑来图定制宁夏景区玻璃钢雕塑厂家鼓楼玻璃钢造型雕塑广东组合式玻璃钢花盆火烈鸟玻璃钢雕塑定制深圳玻璃钢雕塑摆件研究三亚玻璃钢卡通人物雕塑批发安阳玻璃钢雕塑定做价格江苏玻璃钢人物雕塑价格商场美陈dp意思江苏节庆商场美陈销售厂家平度玻璃钢卡通雕塑池州定制玻璃钢雕塑报价江苏开业商场美陈有哪些扬州长方形玻璃钢花盆玻璃钢雕塑塑像发光动物玻璃钢雕塑定做深圳中庭商场美陈有哪些长春玻璃钢造型雕塑上海花钵玻璃钢雕塑定做香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化