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();

结论:

  1. 可以使用 document.createDocumentFragment 创建虚拟节点,从而避免引起没有必要的渲染

  2. 当所有的 li 都创建完毕后,一次性把虚拟节点里的 li 标签全部渲染出来

  3. 可以采取分段渲染的方式,比如一次只渲染一屏的数据

  4. 最后使用 window.requestAnimationFrame 来逐帧渲染

思路:

  1. 导致浏览器卡顿的原因一般都是操作 DOM 的次数太频繁。
  2. 如果想要渲染很多条数据不造成卡顿,那么就一定要尽可能的减少操作 DOM 的次数。
  3. 比方说 React 的虚拟 DOM,本质上就是用 JS 数据来模拟真实 DOM树,从而大大减少了操作真是 DOM 的次数。
  4. 还有在渲染的时候,可以使用 document.createDocumentFragment 创建虚拟节点,从而避免引起没有必要的渲染
  5. 也可以采取分段渲染的方式,最后使用 window.requestAnimationFrame 来逐帧渲染

假如有一个需求,我们要在一个页面中 ul 标签里渲染 **十万** 个 li 标签的更多相关文章

  1. FineUI中在一个页面中通过控件事件(JS)向父页面中添加Tab页

    1.在前台页面尾部添加js代码 </form>    <script type="text/javascript">        var basePath ...

  2. JSTL标签急速秒杀jsp页面中的java代码(一)---Core标签库

    JSTL标签简介 ===================================================================== JSTL的全称是JavaServer Pa ...

  3. 【CSS】如何在一个页面中引入样式css

    CSS(Cascading Style Sheet)又叫层叠样式表.是我们学习前端必不可少的一门语言,学习它其实就是为了学会如何去更改页面标签的样式.目前使用最广的是css3,但同样的,他是从css2 ...

  4. [插件] 如何在一个页面中使用多个SWFUpload对象上传文件

    首先需要引入相应的样式和JS文件,还需要借助jQuery的js 提供下载路径:http://pan.baidu.com/s/1EUzca ① 引入js <script type="te ...

  5. thymeleaf:在一个页面中引入其它的页面

    这个在jsp中很容易实现,但是springBoot不推荐使用jsp,建议使用thymeleaf,下面是在thymeleaf中引入界面的方法 1.修改配置文件 spring: mvc: static-p ...

  6. JS 判断一个字符串是否包含在一个数组中

    var arr = ["白色", "黑色", "红色", "粉色"]; var sel = "黑色" ...

  7. jsp页面中从forEach里向action里面传递其中的一个对象

    <c:forEach var="user" items="${users }"> <form action="user_update ...

  8. 一个页面中使用多个UEditor

    如何在一个页面中使用多个Ueditor: 引入这些js: <script src="~/Scripts/ueditor/ueditor.config.js"></ ...

  9. Confluence 6 插入一个文件到你的页面

    文件可以在页面中以缩略图或者链接的方式显示.我们有多种办法能够上传文件,请参考 Upload Files 页面. 你可以控制文件如何在你的页面中显示.文件在页面中显示的可用方法与你的文件类型有关. 插 ...

  10. JSF页面中使用js函数回调后台action方法

    最近遇到了一个问题就是在JSF页面中嵌入html页面,这个html页面中很多功能是使用js动态生成的,现在需要在js函数里想去调用JSF中action类method()方法并动态传送数据给后台进行处理 ...

随机推荐

  1. Flink State 状态原理解析

    一.Flink State 概念 State 用于记录 Flink 应用在运行过程中,算子的中间计算结果或者元数据信息.运行中的 Flink 应用如果需要上次计算结果进行处理的,则需要使用状态存储中间 ...

  2. STM32外设:专用定时器 IWDG、WWDG、RTC

    主要外设: IWDG:Independent Watch DoG 独立看门狗 WWDG:Window Watch DoG 窗口看门狗 RTC: Real-Time Clock 实时时钟 IWDG 主要 ...

  3. MagicArray基本使用方法

    MagicArray致力于让研发不再卷,这个灵感来源于php语言,可能多少年以后,php可能不会有太多人记得.但是在一个年代里,如果论坛里里常见最火爆的帖子无疑是:php是世界上最好的编程语言.由此可 ...

  4. 万界星空科技五金家具企业MES案例介绍

    五金家具行业MES解决方案 MES系统如何与家具企业生产相匹配?相较于其它大多数工业软件,MES系统无疑是受企业欢迎的软件之一.MES系统处于制造生产企业信息化的核心领域,有着承上启下的作用.那MES ...

  5. Go 泛型之泛型约束

    Go 泛型之泛型约束 目录 Go 泛型之泛型约束 一.引入 二.最宽松的约束:any 三.支持比较操作的内置约束:comparable 四.自定义约束 五.类型集合(type set) 六.简化版的约 ...

  6. ElasticSearch之cat segments API

    命令样例如下: curl -X GET "https://localhost:9200/_cat/segments?v=true&pretty" --cacert $ES_ ...

  7. Windows Server 2012 R2在桌面上显示我的电脑等图标

     从Windows 2012 开始,微软取消了服务器桌面个性化选项,如何重新调出配置界面,可以使用微软命令.方法如下: 按下「Win鍵」+「R」,在运行里输入: rundll32.exe shell3 ...

  8. 非工程师指南: 训练 LLaMA 2 聊天机器人

    引言 本教程将向你展示在不编写一行代码的情况下,如何构建自己的开源 ChatGPT,这样人人都能构建自己的聊天模型.我们将以 LLaMA 2 基础模型为例,在开源指令数据集上针对聊天场景对其进行微调, ...

  9. SQL注入Fuzzing字典

    需要的自取 ' " # - -- ' -- --'; ' ; = ' = ; = -- \x23 \x27 \x3D \x3B' \x3D \x27 \x27\x4F\x52 SELECT ...

  10. Redis 的主从复制

    Redis 主从复制是指:将一台 Redis 服务器的数据复制到其它的 Redis 服务器,前者所在的 Redis 服务器也被称为 "主节点"(Master / Leader),后 ...