假如有一个需求,我们要在一个页面中 ul 标签里渲染 **十万** 个 li 标签
1 // 插入十万条数据
2 const total = 100000;
3 let ul = document.querySelector('ul'); // 拿到 ul
4
5 // 懒加载的思路 -- 分段渲染
6 // 1. 一次渲染一屏的量
7 const once = 20;
8 // 2. 全部渲染完需要多少次,循环的时候要用
9 const loopCount = total / once;
10 // 3. 已经渲染了多少次
11 let countHasRender = 0;
12
13 function add() {
14 // 创建虚拟节点,(使用 createDocumentFragment 不会触发渲染)
15 const fragment = document.createDocumentFragment();
16 // 循环 20 次
17 for (let i = 0; i < once; i++) {
18 const li = document.createElement('li');
19 li.innerText = Math.floor(Math.random() * total);
20 fragment.appendChild(li);
21 }
22 // 最后把虚拟节点 append 到 ul 上
23 ul.appendChild(fragment);
24 // 4. 已渲染的次数 + 1
25 countHasRender += 1;
26 loop();
27 }
28
29 // 最重要的部分来了
30 function loop() {
31 // 5. 如果还没渲染完,那么就使用 requestAnimationFrame 来继续渲染
32 if (countHasRender < loopCount) {
33 // requestAnimationFrame 叫做逐帧渲染
34 // 类似于 setTimeout(add, 16);
35 // 帧:一秒钟播放多少张图片,一秒钟播放的图片越多,动画就约流畅
36 // 1000/60 = 16
37 window.requestAnimationFrame(add);
38 }
39 }
40 loop();
结论:
可以使用 document.createDocumentFragment 创建虚拟节点,从而避免引起没有必要的渲染
当所有的 li 都创建完毕后,一次性把虚拟节点里的 li 标签全部渲染出来
可以采取分段渲染的方式,比如一次只渲染一屏的数据
最后使用 window.requestAnimationFrame 来逐帧渲染
思路:
- 导致浏览器卡顿的原因一般都是操作 DOM 的次数太频繁。
- 如果想要渲染很多条数据不造成卡顿,那么就一定要尽可能的减少操作 DOM 的次数。
- 比方说 React 的虚拟 DOM,本质上就是用 JS 数据来模拟真实 DOM树,从而大大减少了操作真是 DOM 的次数。
- 还有在渲染的时候,可以使用 document.createDocumentFragment 创建虚拟节点,从而避免引起没有必要的渲染
- 也可以采取分段渲染的方式,最后使用 window.requestAnimationFrame 来逐帧渲染
假如有一个需求,我们要在一个页面中 ul 标签里渲染 **十万** 个 li 标签的更多相关文章
- FineUI中在一个页面中通过控件事件(JS)向父页面中添加Tab页
1.在前台页面尾部添加js代码 </form> <script type="text/javascript"> var basePath ...
- JSTL标签急速秒杀jsp页面中的java代码(一)---Core标签库
JSTL标签简介 ===================================================================== JSTL的全称是JavaServer Pa ...
- 【CSS】如何在一个页面中引入样式css
CSS(Cascading Style Sheet)又叫层叠样式表.是我们学习前端必不可少的一门语言,学习它其实就是为了学会如何去更改页面标签的样式.目前使用最广的是css3,但同样的,他是从css2 ...
- [插件] 如何在一个页面中使用多个SWFUpload对象上传文件
首先需要引入相应的样式和JS文件,还需要借助jQuery的js 提供下载路径:http://pan.baidu.com/s/1EUzca ① 引入js <script type="te ...
- thymeleaf:在一个页面中引入其它的页面
这个在jsp中很容易实现,但是springBoot不推荐使用jsp,建议使用thymeleaf,下面是在thymeleaf中引入界面的方法 1.修改配置文件 spring: mvc: static-p ...
- JS 判断一个字符串是否包含在一个数组中
var arr = ["白色", "黑色", "红色", "粉色"]; var sel = "黑色" ...
- jsp页面中从forEach里向action里面传递其中的一个对象
<c:forEach var="user" items="${users }"> <form action="user_update ...
- 一个页面中使用多个UEditor
如何在一个页面中使用多个Ueditor: 引入这些js: <script src="~/Scripts/ueditor/ueditor.config.js"></ ...
- Confluence 6 插入一个文件到你的页面
文件可以在页面中以缩略图或者链接的方式显示.我们有多种办法能够上传文件,请参考 Upload Files 页面. 你可以控制文件如何在你的页面中显示.文件在页面中显示的可用方法与你的文件类型有关. 插 ...
- JSF页面中使用js函数回调后台action方法
最近遇到了一个问题就是在JSF页面中嵌入html页面,这个html页面中很多功能是使用js动态生成的,现在需要在js函数里想去调用JSF中action类method()方法并动态传送数据给后台进行处理 ...
随机推荐
- 为什么许多数字孪生产品开始了GIS融合的尝试?
随着数字孪生技术的发展,越来越多的产品意识到要实现数字孪生的最大价值,需要考虑多个维度的数据,包括空间信息.地理位置.环境条件等.因此,许多数字孪生产品开始了与GIS系统的融合尝试,以进一步提升其功能 ...
- mysql 数据库 定时 备份到阿里云盘
仓库地址: gitee:db_backup_script: mysql 数据库 定时/实时 备份数据库到阿里云盘,备份成功后消息可通知到钉钉群.企业微信群.wxpusher (gitee.com gi ...
- 23、Flutter AppBar TabBar TabBarView
AppBar自定义顶部按钮图标.颜色 class MyHomePage extends StatelessWidget { const MyHomePage({super.key}); @overri ...
- three.js中的矩阵计算
目录 1. 概述 2. 详论 2.1. 行主序与列主序列 2.2. 矩阵乘法 3. 参考 1. 概述 three.js中自带了矩阵运算库,不过在使用的过程中总是容易混淆.不知道是行主序还是列主序,前乘 ...
- 异步、多线程、Await/Async、Task
异步多线程经常被拿来说事,网上文章也是多如牛毛,我也是停留在很菜的水平,痛下决心好好"恶补"一下这块知识. 还是先放两个官方文档压压惊:使用 Async 和 Await 的异步编程 ...
- C++篇:第九章_字符串_知识点大全
C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 九.字符串 可以用[ ]进行下标访问 使用string类需将头文件包含在程序中, ...
- 618狂欢结束,来聊聊华为云GaussDB NoSQL的蓬勃张力
又到了一年一度的 618大促的时候,随着近十年网上购物的兴起,各大平台在不同的时期推出各种购物促销活动,极大的促进了消费,刺激了市场.同样,在科技领域,为了支撑突然而来的高并发,支持千万人同时在线浏览 ...
- 手把手教你在昇腾平台上搭建PyTorch训练环境
摘要:在昇腾平台上运行PyTorch业务时,需要搭建异构计算架构CANN软件开发环境,并安装PyTorch 框架,从而实现训练脚本的迁移.开发和调试. 本文分享自华为云社区<手把手教你在昇腾平台 ...
- 华为云举办AI经典论文复现活动,打造领先AI开发者学习社区
摘要:百余篇经典论文算法上线华为云AI Gallery,学AI就用ModelArts 2020年8月28日,华为云AI院长峰会在杭州千岛湖举行,来自中国科学院.中国工程院的多位院士,以及清华大学.北京 ...
- 百万奖池角逐,华为云IoT边缘带你看懂“边缘计算开发者大赛”
摘要:2022年9月1日,第二届边缘计算开发者大赛正式启动. 2022年9月1日,第二届边缘计算开发者大赛正式启动! 本届大赛由华为云参与承办,中国信息通信研究院.工业互联网产业联盟.边缘计算产业联盟 ...