假如有一个需求,我们要在一个页面中 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()方法并动态传送数据给后台进行处理 ...
随机推荐
- 【UniApp】-uni-app-路由
前言 好,经过上个章节的介绍完毕之后,了解了一下 uni-app-CompositionAPI应用生命周期和页面生命周期 那么了解完了uni-app-CompositionAPI应用生命周期和页面生命 ...
- Odoo16—权限控制
odoo的权限控制是通过用户组来实现的,在用户组中配置控制权限,然后再添加用户到用户组中,从而实现对用户的访问和操作权限控制.一个用户可以属于多个用户组,用户最终的权限范围取决于所属用户组权限的并集. ...
- django模型不应该作为参数传递给task
Django 模型对象.它们不应该作为任务的参数传递.当任务运行时从数据库重新获取对象几乎总是更好,因为使用旧数据可能会导致竞争条件. 想象一下以下场景,您有一篇文章和一个自动扩展其中一些缩写的任务: ...
- Go 泛型之类型参数
Go 泛型之类型参数 一.Go 的泛型与其他主流编程语言的泛型差异 Go泛型和其他支持泛型的主流编程语言之间的泛型设计与实现存在差异一样,Go 的泛型与其他主流编程语言的泛型也是不同的.我们先看一下 ...
- NetSuite 开发日记 —— 库存详细信息记录更改数量问题
详细报错: "type":"error.SuiteScriptError","name":"USER_ERROR",&q ...
- 【C++】【图像处理】灰度直方图实现算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)
前情提要:本记录需要一定的C++和图像处理基础进行阅读. 图像处理算法学习记录: Code: 1 void histCompute(BYTE*image, int width, int height) ...
- 玩转Python:处理音频文件,两个非常重要的库,很实用,附代码
pyaudio和sounddevice都是用于Python中音频处理和流的库,允许用户通过他们的API录制.播放和处理音频数据.下面是对这两个库的简要介绍: PyAudio PyAudio 提供了 P ...
- 遍历菜单树得到所有菜单ids
1.前言 在我们实现菜单管理页面的时候,有时候我们需要默认展开所有的菜单列表,但是因为后端有时候没有返回所有菜单ids数组. 而且我们也不容易获取到所有菜单ids,比如如果我们通过角色id查询到所有菜 ...
- Java 设置Excel页面背景
本文介绍通过Java 程序在Excel表格中设置页面背景的方法,可设置颜色背景(即指定单一颜色作为背景色).图片背景(即加载图片设置成页面背景).程序中需要使用免费版Excel类库工具 Free Sp ...
- 7种创建方式,带你理解Java的单例模式
本文分享自华为云社区<<Java极简设计模式>第01章:单例模式(Singleton)>,作者:冰 河. 单例设计模式 看几个单例对象的示例代码,其中有些代码是线程安全的,有些 ...