虚拟列表:性能优化之高性能渲染十万条数据

渲染十万条数据的方法之虚拟列表 为了高效地渲染大量数据(如 10 万条数据),可以使用虚拟列表技术。虚拟列表只渲染可视区域内的元素,随着用户滚动动态加载更多元素,从而提高性能。以下是一个使用原生 JavaScript 和 React 实现虚拟列表渲染 10 万条数据的示例。 阅读详情

场景:后端如果一次性返回十万条数据,性能最好的chrome,也会变的十分卡顿,大概需要花费10秒左右,主要性能瓶颈是在把数据加载到html中花费的时间,那么如何能解决这个让他头疼的问题呢,我们的主角“虚拟列表”闪亮登场!

方法一(不推荐);

有的同学使用setTimeout来分批定时渲染

<ul id="container"></ul>
//需要插入的容器
let ul = document.getElementById('container');
// 插入十万条数据
let total = 100000;
// 一次插入 20 条
let once = 20;
//总页数
let page = total/once
//每条记录的索引
let index = 0;
//循环加载数据
function loop(curTotal,curIndex){
    if(curTotal <= 0){
        return false;
    }
    //每页多少条
    let pageCount = Math.min(curTotal , once);
    setTimeout(()=>{
        for(let i = 0; i < pageCount; i++){
            let li = document.createElement('li');
            li.innerText = curIndex + i + ' : ' + ~~(Math.random() * total)
            ul.appendChild(li)
        }
        loop(curTotal - pageCount,curIndex + pageCount)
    },0)
}
loop(total,index);

 

用一个gif图来看一下效果

我们可以看到,页面加载的时间已经非常快了,每次刷新时可以很快的看到第一屏的所有数据,但是当我们快速滚动页面的时候,会发现页面出现闪屏或白屏的现象。

出现白屏的原因:是因为setTimeout的执行时间并不是确定的,setTimeout中对dom进行操作,必须要等到屏幕下次绘制时才能更新到屏幕上,如果两者步调不一致,就可能导致中间某一帧的操作被跨越过去,而直接更新下一帧的元素,从而导致丢帧现象。

方法二:使用 requestAnimationFrame(推荐)

与setTimeout相比,requestAnimationFrame最大的优势是由系统来决定回调函数的执行时机。如果屏幕刷新率是60Hz,那么回调函数就每16.7ms被执行一次,如果刷新率是75Hz,那么这个时间间隔就变成了1000/75=13.3ms,换句话说就是,requestAnimationFrame的步伐跟着系统的刷新步伐走。它能保证回调函数在屏幕每一次的刷新间隔中只被执行一次,这样就不会引起丢帧现象。

我们使用requestAnimationFrame来进行分批渲染:

<ul id="container"></ul>
//需要插入的容器
let ul = document.getElementById('container');
// 插入十万条数据
let total = 100000;
// 一次插入 20 条
let once = 20;
//总页数
let page = total/once
//每条记录的索引
let index = 0;
//循环加载数据
function loop(curTotal,curIndex){
    if(curTotal <= 0){
        return false;
    }
    //每页多少条
    let pageCount = Math.min(curTotal , once);
    window.requestAnimationFrame(function(){
        for(let i = 0; i < pageCount; i++){
            let li = document.createElement('li');
            li.innerText = curIndex + i + ' : ' + ~~(Math.random() * total)
            ul.appendChild(li)
        }
        loop(curTotal - pageCount,curIndex + pageCount)
    })
}
loop(total,index);


这样就完美解决加载十万条问图^-^,点赞关注哦

Web Worker + 虚拟滚动:十万条数据渲染性能优化实战 前端大数据量列表渲染时,浏览器主线程既要承担数据格式化、排序等计算,又要处理大量DOM节点的布局与绘制,极易出现长任务阻塞和滚动卡顿。Web Worker 提供了独立于主线程的 JavaScript 执行环境,配合 postMessage 分片通信,能把计算密集任务转移到后台线程;虚拟滚动则通过只渲染可视区域内的行来降低 DOM 节点数量。两者结合可显著提升首屏可用时间与滚动流畅度,适合日志列表、监控事件流、IM 聊天记录等场景。从概念到工程实践,理解这套组合是应对十万级数据列表渲染的关键。 阅读详情

相关推荐

浅析虚拟列表高性能渲染大体量数据原理

 在工作中,有时会遇到需要一些不能使用分页方式来加载列表数据的业务情况,对于此,我们称这种列表叫做长列表。比如,在一些外汇交易系统中,前端会实时的展示用户的持仓情况(收益、亏损、手数等),此时对于用户的持仓列表一般是不能分页的。   在浅析如何利用时间分片高性能渲染十万级数据一文中,提到了可以使用时间分片的方式来对长列表进行渲染,但这种方式更适用于列表项的DOM结构十分简单的情况。本文会介绍使用虚拟列表的方式,来同时加载大量数据。 一、为什么需要使用虚拟列表   在实际的工作中,列表项必然不会仅仅只由

Jack, what else can you do besides holding your little darling? 371

FGUI中List的虚拟列表怎么使用

FGUI中List的虚拟列表怎么使用

2301_77986439的博客 841

虚拟列表控件的列优化

虚拟列表控件对列并没有优化,本程序演示含100列的列表控件如何加快速度。 vc6 版本

虚拟列表:性能优化

前端列表优化:虚拟列表

GrootSwt的博客 698

vxe-table::dolphin: vxe-table vue 表格解决方案

vxe-table 简体中文|| 一个基于的PC端表格组件,支持增删改查、虚拟滚动、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、虚拟列表、弹窗、自定义模板、渲染器、贼灵活的配置项、扩展接口等... 设计理念 面向现代浏览器,高效的简洁API 设计 模块化表格、按需加载、扩展接口 为单行编辑表格而设计,支持增删改查及更多扩展,强大的功能的同时兼具性能 计划 v1.0 基于vue2.6+,支持所有主流的浏览器,实现表格的一切实用的功能 v2.0 基于vue2.6+,支持所有主流的浏览器,同时兼具功能与性能 v3.0 基于vue2.6+,支持现代浏览器并保留兼容IE11,提升渲染性能 v4.0 基于vue3.0+,只支持现代浏览器,不支持IE QQ 交流群 浏览器支持 Latest :check_mark: Latest :check_mark: Latest :check_mark: Latest :check_mark: 8+

Android Listview 滑动过程中提示图片重复错乱的原因及解决方法

android中listview是比较常见的组件,通过本文主要给大家分析Android中Listview滚动过程造成的图片显示重复、错乱、闪烁的原因及解决方法,顺便跟进Listview的缓存机制,感兴趣的朋友一起看下吧

Fgui Glist 实现无限滑动 虚拟列表

在项目中 需要建立一个大量对象的滑动列表 每一个数据都不一样. 一开始全部直接生成 在手机上测试的时候初始化的时候 加载时间太长大概2秒....... 后来用了虚拟列表一下流畅了 虚拟列表实现原理 只有在界面展示的地方才去做生成物品对象.大量节省加载速度. 初始化的时候 SetFanXingInit() { this.fanxing_list.setVirtual(); this.fanxing_list.itemRenderer = this.

qq_38147639的博客 1329

微信自动化必备软件:inspect(获取微信界面元素)

SaveButton10015.2:1 ✅(合格)Passed ✅说明这个控件完全符合无障碍标准。

Ven%的博客 1382

Unity引擎UGUI/FGUI 开发总结

在当前UGUI和FGUI的开发和优化基础上,进一步的实践和优化可以针对大型项目中的性能热点、复杂UI结构的管理、团队协作开发以及未来的技术趋势进行深入探索。在实际开发中,游戏的UI结构往往非常复杂,可能包含多层嵌套的界面、动态生成的UI元素以及大量交互逻辑。无论是UGUI还是FGUI,结合高级实践和工具优化,可以在中大型项目中充分发挥其潜力,为玩家带来更优质、更流畅的交互体验。在UI开发的深入实践中,结合UGUI和FGUI的特性,可以进一步探索高级功能实现和未来的技术应用方向,如。

小宝哥Code的专栏 6809

爱快路由(ikuai)多WAN口配置实战:提升网络带宽与稳定性

本文详细解析了爱快路由(ikuai)多WAN口配置的实战技巧,包括双线智能分流、毫秒级故障切换和带宽叠加利用等核心功能。通过七种配置方案和智能QoS策略,帮助企业提升网络带宽与稳定性,实现99.9%以上的高可用性。

weixin_30566063的博客 702

《阵列信号处理及MATLAB实现》阵列响应矩阵(均匀线阵、均匀圆阵、L型阵列、平面阵列和任意阵列)

《阵列信号处理及MATLAB实现》内容总结,如需阅读更详细内容请购买正版书籍。

APPLECHARLOTTE的博客 1万+

FGUI的常用方法

素材管理 可以直接将图片(Gif)、声音(mp3)、动画、文字等素材从资源浏览器拖动到库中。 资源Url UIPackage.getItemURL(“包名“,“资源名”) AudioClip clip = (AudioClip)UIPackage.GetItemAsset(“包名称”,”声音名称”); 菜单”编辑”->“创建位图字体”,(输入字符,显示对应图片) 多信息文本(GRichTextField)支持链接和图文混排。 用例: aTextField.text = “请

暗夜—心~殇 5350

Pintos project 1 实验报告(代码分享)

任务一 Alarm Clock 用到的相干目录有: pintos/src/devices time.h && time.c pintos/src/threads thread.h && thread.c 预期pass希望:暂无,安装pintos之后,第一次对threads进行make check操作,可以发现以alarm--开头的前六个文件,以及mlfqs-fair-2和mlfqs-fair-20文件,一开始就测试成功pass。但是为了避免对后期的修改有影响,这里还是要

m0_53112875的博客 6869

在vue中如何高性能渲染十万条数据(虚拟列表)并且增加个搜索框可以搜索到这些数据

在工作中,有时会遇到需要一些不能使用分页方式来加载列表数据的业务情况,对于此,我们称这种列表叫做长列表。比如,在一些外汇交易系统中,前端会实时的展示用户的持仓情况(收益、亏损、手数等),此时对于用户的持仓列表一般是不能分页的。 那么我们应该怎么操作才能够提高浏览器渲染的性能呢?下面是一种具体的做法,引用的是云中桥的文章高性能渲染十万条数据。 什么是虚拟列表 虚拟列表其实是按需显示的一种实现...

前端李小白的博客 8869

用Python进行GEO数据挖掘(学习笔记四):富集分析

该笔记详细解释了富集分析的工作原理,并简要地利用gseapy在python中进行富集分析的操作。

m0_64111502的博客 5649

【HDR】曝光融合(Exposure Fusion)

在曝光融合(Exposure Fusion)算法问世之前,多曝光序列合成用于显示的HDR需要两个步骤,第一步是将多张不同曝光的低动态范围图像合成为HDR(例如Debevec提出的加权融合方法),通常HDR为12bit或者16bit;第二步是通过tonemapping对高动态范围HDR进行压缩以支持低动态范围显示设备(例如Durand提出的基于双边滤波的tonemapping算法),一般会压缩至8bit。

专注人工智能,主攻CV 1万+

「前端进阶」高性能渲染十万条数据(虚拟列表)

前言 在工作中,有时会遇到需要一些不能使用分页方式来加载列表数据的业务情况,对于此,我们称这种列表叫做长列表。比如,在一些外汇交易系统中,前端会实时的展示用户的持仓情况(收益、亏损、手数等),此时对于用户的持仓列表一般是不能分页的。 在高性能渲染十万条数据(时间分片)一文中,提到了可以使用时间分片的方式来对长列表进行渲染,但这种方式更适用于列表项的DOM结构十分简单的情况。本文会介绍使用虚拟...

lotte 4778

YOLOv11 知识蒸馏完整实战:Teacher–Student 训练策略与性能飞跃

在self.alpha = alpha # 蒸馏损失权重self.temperature = temperature # 温度系数,控制分布平滑度# 输出分布蒸馏(KL散度损失)# 中间特征蒸馏(MSE损失,对齐中间层特征)# 总蒸馏损失知识蒸馏是YOLOv11在“小模型高性能部署”场景的“破局之法”——它让小模型能“站在大模型的肩膀上”,兼具速度与精度。从损失函数定义到多阶段训练,再到实战落地,本教程已为你铺就了一条清晰的路径。

m0_64661770的博客 141

react-window深度解析:高效渲染十万级列表的React组件库

你是否曾遇到过这样的场景:在React应用中渲染包含成千上万条数据的列表时,页面变得卡顿、滚动不流畅,甚至出现浏览器崩溃?当列表数据量达到十万级别时,传统的渲染方式往往会导致DOM节点数量暴增,严重影响页面性能和用户体验。 react-window(React视窗组件库)正是为解决这一痛点而生。它通过**虚拟列表(Virtual List)** 技术,只渲染当前视窗内可见的列表项,从而在有限的D...

gitblog_00690的博客 1256

[QMT量化交易小白入门]-104、QMT平台运行深度学习模型,预测期货价格

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 485

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

突破数据渲染瓶颈:iView虚拟滚动技术让十万级数据秒开

在当今大数据时代,前端开发者经常面临一个棘手问题:如何处理海量数据的展示?当表格数据达到数万甚至十万级别时,传统渲染方式往往导致页面卡顿、内存溢出,严重影响用户体验。iView作为一款基于Vue.js 2.0的高质量UI组件库,通过其强大的**虚拟滚动技术**完美解决了这一难题,让大规模数据渲染变得轻松高效。✨ ## 🔍 什么是虚拟滚动技术? 虚拟滚动(Virtual Scrolling)是

gitblog_00480的博客 972

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jq动态渲染后获取不到元素高度_高性能渲染十万条数据(虚拟列表)

前言在工作中,有时会遇到需要一些不能使用分页方式来加载列表数据的业务情况,对于此,我们称这种列表叫做 长列表。比如,在一些外汇交易系统中,前端会实时的展示用户的持仓情况(收益、亏损、收入等),此时对于用户的持仓列表一般是不能分页的。在高性能渲染十万条数据(时间分片)一文中,提到了可以使用 时间分片的方式来对长列表进行渲染,但这种方式更适用于列表项的DOM结构十分简单的情况。本文会介绍使用 虚拟列表...

weixin_39950470的博客 822

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

突破数据渲染瓶颈:react-window构建高性能虚拟列表的实战指南

你是否曾因前端页面加载 thousands 条数据而导致浏览器卡顿甚至崩溃?当用户滚动列表时,页面是否出现明显的延迟和掉帧?react-window 虚拟列表(Virtual List)技术正是解决这类性能问题的最佳方案。本文将带你从实际应用场景出发,掌握如何使用 react-window 构建高性能列表,轻松应对 10 万+数据渲染场景,让你的应用体验如丝般顺滑。 读完本文后,你将能够: - ...

gitblog_01029的博客 936

高性能渲染十万条数据(时间分片)

前言 在实际工作中,我们很少会遇到一次性需要向页面中插入大量数据的情况,但是为了丰富我们的知识体系,我们有必要了解并清楚当遇到大量数据时,如何才能在不卡主页面的情况下渲染数据,以及其中背后的原理。 对于一次性插入大量数据的情况,一般有两种做法: 时间分片 虚拟列表 本文作为开篇,着重来介绍如何使用 时间分片的方式来渲染大量数据,虚拟列表相关的内容,日后会持续整理。 最粗暴的做法(一次性渲染) 我们...

qq_28875189的博客 913

MudBlazor虚拟滚动列表:大数据集渲染性能优化

当你尝试在Blazor应用中渲染10,000+条数据时,是否遇到过页面加载缓慢、滚动卡顿甚至浏览器崩溃的情况?传统渲染方式会一次性创建所有DOM节点,导致DOM树过于庞大,严重影响页面响应速度。MudBlazor虚拟滚动(Virtualization)技术通过仅渲染可视区域内的元素,将DOM节点数量减少90%以上,彻底解决大数据集渲染性能瓶颈。本文将深入剖析MudBlazor虚拟滚动的实现原理、核...

gitblog_00308的博客 1149
上一篇: VUE按需引入ANT DESIGN报错“ERROR IN ./NODE_MODULES/ANT-DESIGN-VUE/ES/EMPTY/STYLE/INDEX.LESS”解决办法
下一篇: layui iframe 中 alert无法弹出
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

时光机上敲代码

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

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

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

打赏作者

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

抵扣说明:

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

余额充值