假如有一个需求,我们要在一个页面中 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()方法并动态传送数据给后台进行处理 ...
随机推荐
- Vue2.0 学习 第三组 条件语句
本笔记主要参考菜鸟教程和官方文档编写.1.v-if在div或者之类的dom中使用v-if可以控制是否插入该dom,控制由v-if的true和false决定.如:<div id="app ...
- JWT简单使用
创建一个Maven项目,并导入jar包 <?xml version="1.0" encoding="UTF-8"?> <project xml ...
- 时间加权平均价格算法(TWAP)和成交量平均算法(VWAP)在量化回测的应用
为什么要引入TWAP和 VWAP? 为了评估策略的资金容量,我们对M.trade模块里买入点和卖出点这两个参数进行了更丰富的扩展,支持了策略能够按更丰富的算法交易价格(WAP)进行撮合. 如果资金是1 ...
- Netty源码学习9——从Timer到ScheduledThreadPoolExecutor到HashedWheelTimer
系列文章目录和关于我 一丶前言 之前在学习netty源码的时候,经常看netty hash时间轮(HashedWheelTimer)的出现,时间轮作为一种定时调度机制,在jdk中还存在Timer和Sc ...
- 数字孪生结合GIS能够为城市灾害预防工作提供什么帮助?
数字孪生技术结合GIS(地理信息系统)在城市灾害预防工作中发挥着重要的作用,为城市的安全和可持续发展提供了关键帮助.数字孪生是一种将现实世界与数字虚拟世界相结合的技术,可以帮助城市规划者和管理者更好地 ...
- 欧拉定理 & 扩展欧拉定理 笔记
欧拉函数 欧拉函数定义为:\(\varphi(n)\) 表示 \(1 \sim n\) 中所有与 \(n\) 互质的数的个数. 关于欧拉函数有下面的性质和用途: 欧拉函数是积性函数.可以通过这个性质求 ...
- SQL 的递归查询
在一般的业务场景中,特别是针对相关的业务线相关的功能开发时,可能会遇到一些具有层级关系的数据关联结构.比如,一个员工可能属于一个领导管辖,而同时,这个领导也被另一个更高级别的领导管辖--,而本质上这些 ...
- 3、Container容器组件
Container容器组件 代码 import 'package:flutter/material.dart'; void main() { runApp(MaterialApp( hom ...
- C# 将XML转为Word(附VB.NET代码)
本文介绍如何通过C#程序代码方法将XML文件转换为Word文档,包括转为.doc /.docx等格式.并附VB.NET代码,有需要可供参考. 程序中所需必要程序集如下图: ★ 程序集获取:官方地址: ...
- 云小课|MRS基础原理之Flink组件介绍
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:Flink是一个批 ...