网站首页 > 技术文章 正文
前言
在项?中,有时需要展?上万条甚??万条数据,?如何在保证性能的前提下?效地渲染这些数据成为了我?临的难题。在经过?段时间的摸索和实践后,我积累了?些经验和技巧,现在我将这些分享给?家。
本篇文章开始之前说明:这些只是小编的微末见解,如有瑕疵,欢迎指正!!
另外小编联合阿里、字节大牛总结了前端面试的必备文档(主要还是大佬总结的,本人摸鱼~)如果有需要获取完整版的小伙伴关注我之后点赞+转发,私信回复【学习】即可领取
不进行任何操作(?次性渲染)
这种?法的核?理念是尽可能减少对DOM的操作,特别是在处理?量数据时。DOM操作通常是相对昂贵的,因为它们会触发浏览器的回流和重绘。
回流指的是浏览器根据最新的 DOM 树计算元素的?何属性,然后再进?布局,?重绘则是将元素的像素信息绘制到屏幕上。
我们?两个输出语句来看看 js代码运?时间 和 总渲染时间 ,把它们进?对?:
- 在 JS 的 Event Loop 中,当JS引擎所管理的执?栈中的事件以及所有微任务事件全部执?完
后,才会触发渲染线程对??进行渲染;
- 第?个 console.log 的触发时间是在??进?渲染之前,此时得到的间隔时间为JS运?所需要
的时间;
- 第?个 console.log 是放到 setTimeout 中的,它的触发时间是在渲染完成,在下?次Event Loop 中执?的;
对?时间我们可以看?,渲染的时间也太?了,所以我们得想想办法,有没有什么?法可以优化?下渲染的过程;
setTimeout(使?定时器)
setTimeout 的?作原理是将任务放?事件队列中,等待当前执?栈清空后执?。这种?法可以?来延迟执?某些耗时的操作,以允许浏览器在操作之间进???重绘。
我们根据上?代码改编?下:
现在数据有了,但是我发现如果快速往下滑动的时候,会有类似 闪屏 的效果
这是因为原因:
- setTimeout的执?时间是不确定的 ,setTimeout任务被放?事件队列中,只有在主线程执?完毕后才会检查并执?事件队列中的任务。
- 屏幕刷新频率受分辨率和屏幕尺?影响 ,?setTimeout只能设置?个固定的时间间隔,这个时间不?定和屏幕刷新时间相同。
requestAnimationFrame + fragment (时间分?)
requestAnimationFrame 是?种在浏览器重绘之前执?操作的?法,通常?于动画和其他需要?性能的场景。它可以保证回调函数在每次??重绘之前执?,从而避免了由于执?操作?导致的??抖动问题。
更新后的代码如下:
补充
requestAnimationFrame (RAF)和 setTimeout 都是?于控制 JavaScript 代码执?时间的
?法,但它们有?些关键的区别:
1. 执?时机:
- setTimeout :将任务放?事件队列,并在指定的延迟时间后执?任务。但是,由于JavaScript 是单线程的,如果主线程忙于执?其他任务, setTimeout 中的任务可能会被延。
迟执?。
- requestAnimationFrame :在浏览器下?次重绘之前执?任务。它会与浏览器的渲染循
环同步,以确保在??重新绘制时执?任务,通常是每秒 60 次(60Hz)。
2. 性能优化:
- setTimeout :尽管可以设置延迟时间,但执?时间并不是可靠的。这可能导致性能问题,
尤其是在需要频繁执?的动画或渲染任务中。
- requestAnimationFrame :浏览器会?动优化执?时间,通常能够更好地与??渲染协
调,避免因执?任务?导致的卡顿或闪烁。
3. ?途:
- setTimeout :适?于?般性的延迟执?任务,例如定时器功能或简单的异步操作。
- requestAnimationFrame :主要?于执?与??渲染相关的任务,如动画或需要频繁更新的 UI 效果。它可以确保在每次??重绘时都进?优化的任务执?,以提供更流畅的??体验。
虚拟列表
虚拟列表是?种专?为处理?量数据?设计的优化?案。它的核?思想是只渲染当前可视区域内的数据,?不是?次性渲染所有数据。通过动态计算可视区域内需要展?的数据,可以有效地减少渲染时间和资源消耗,提???的响应速度和流畅度。
如图:
虚拟列表的实现通常包括以下?个步骤:
? 计算可视区域:获取可视区域的?度,并根据滚动位置计算可视区域内的起始和结束索引。
? 动态渲染:根据计算得到的起始和结束索引,从数据源中获取相应的数据进?渲染。
? 滚动优化:监听滚动事件,当滚动位置发?变化时,重新计算可视区域并更新渲染的数据。
实现?意图:
本篇文章到此结束啦!这些只是小编的微末见解,如有瑕疵,欢迎指正!!
另外小编联合阿里、字节大牛总结了前端面试的必备文档(主要还是大佬总结的,本人摸鱼~)如果有需要获取完整版的小伙伴关注我之后点赞+转发,私信回复【学习】即可领取
猜你喜欢
- 2025-01-20 threejs渲染高级感可视化涡轮模型
- 2025-01-20 跨平台渲染乐谱?如何能不用 alphaTab 呢?
- 2025-01-20 为何 nivo 能成为 D3 图表渲染库顶流?
- 2025-01-20 FixedDataTable: React.js 灵活快速延迟表格渲染?
- 2025-01-20 为何 KaTeX 能成为 Web 公式渲染天花板?
- 2025-01-20 前端流行框架Vue3教程:2. Vue模板语法(3)条件渲染
- 2025-01-20 前端运行机制--页面渲染流程
你 发表评论:
欢迎- 05-30为什么说网上的md5加密解密站都是通过彩虹表解密的?
- 05-30一文读懂md5,md5有什么用,什么是md5加盐
- 05-30Java md5加密解密数据
- 05-30MD5是什么?如何进行MD5校验?
- 05-30专家教你简单又轻松的MD5解密方法,一看就会
- 05-30多学习才能多赚钱之:vscode怎么安装插件
- 05-30VSCode无限画布模式(可能会惊艳到你的一个小功能)
- 05-30VSCode神级Ai插件Cline:从安装到实战【创建微信小程序扫雷】
- 473℃几个Oracle空值处理函数 oracle处理null值的函数
- 467℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 463℃Oracle分析函数之Lag和Lead()使用
- 451℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 447℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 443℃【数据统计分析】详解Oracle分组函数之CUBE
- 424℃Oracle有哪些常见的函数? oracle中常用的函数
- 421℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)