假如有一个需求,我们要在一个页面中 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()方法并动态传送数据给后台进行处理 ...
随机推荐
- 7-8次PTA和期末成绩总结
(1)前言:总结之前所涉及到的知识点.题量.难度等情况 课程成绩统计程序-3在第二次的基础上修改了计算总成绩的方式(修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课 ...
- [CF1748D] ConstructOR
题目描述 You are given three integers $ a $ , $ b $ , and $ d $ . Your task is to find any integer $ x $ ...
- 简便实用:在 ASP.NET Core 中实现 PDF 的加载与显示
前言 在Web应用开发中,经常需要实现PDF文件的加载和显示功能.本文小编将为您介绍如何在ASP.NET Core中实现这一功能,以便用户可以在Web应用中查看和浏览PDF文件. 实现步骤 1)在服务 ...
- 从零玩转Activiti7工作流-2021-09-12-16-22-07
title: 从零玩转Activiti7工作流 date: 2021-09-12 16:22:08.51 updated: 2021-12-26 17:43:12.171 url: https://w ...
- Python——第四章:匿名函数(lambda 函数)
匿名函数也被称为 lambda 函数 lambda 函数是一种小型.一次性的.可以在一行内定义的匿名函数.它通常用于一些简单的操作,例如传递给高阶函数(接受函数作为参数的函数)或在一行内定义短小的功能 ...
- 零基础电气专业毕业生,花费9.9元自学前端,成都月薪6.5K
介绍 毕业于成都理工电气专业,大学毕业后进入了一家电气公司,月薪2000元.一直对互联网行业感兴趣,但由于没有相关专业背景,所以一直没有勇气转行. 转行契机 公司的书记想搞一个内部生产管理系统,看我们 ...
- Fpga开发笔记(一):高云FPGA芯片介绍,入手开发板套件、核心板和底板介绍
前言 FPGA作为一种逻辑芯片,硬件架构独特,具有并行性.低延时性和灵活性等特性,应用领域广泛. FPGA市场主要玩家是英特尔.AMD.莱迪思.Microchip.Achronix等:国内厂商包 ...
- 在Docker上面安装/启动、运行、挂载MySQL5.7
下载文档请看:https://hub.docker.com/r/mysql/mysql-server 一.下载镜像 执行命令: docker pull mysql/mysql-server:5.7 查 ...
- hiveSQL常见专题
SQL强化 SQL执行顺序 --举例: select a.sex, b.city, count(1) as cnt, sum(salary) as sum1 from table1 a join ta ...
- 自签证书https
1.下载编译好的openssl. http://slproweb.com/products/Win32OpenSSL.html 下载完成后运行安装: 记住你安装到的目录,等下打开这个文件夹(小贴士:最 ...