js渲染10万数据列表,不阻塞UI
前言
最近公司项目快结项了,但是我发现公司的每个页面打开都比较卡,究其原因数据量大,请求多,渲染慢。加之面试的时候也遇到过此类问题,那么今天就来尝试去实现一下。
一、整理思路
首先我们要知道js处理大量数据并没有花费多长时间。耗时最长的是渲染dom元素。一次加载完需要耗费大量时间,所以我们可以把数据切割成一个个小块。每次渲染一小块就能够将dom渲染出来了。
二、代码实现
<ul></ul>
// 第一种实现方式
const $UL = document.querySelector('ul')
let size = 0
const myList = getList()// 生成数据
function getList() {let list = []for (let i = 0; i < 5005000; i++) {list.push(i)}return list
}function render(list) {let tempBox = document.createDocumentFragment()list.map(function (data) {let li = document.createElement('li')li.innerHTML = datatempBox.appendChild(li)})$UL.append(tempBox)
}function splitList() {if (size + 100 < myList.length) {render(myList.slice(size, size + 100))size += 100requestAnimationFrame(splitList)} else {render(myList.slice(size, size + myList.length - size))size = myList.length - size}
}requestAnimationFrame(splitList)
可能有些同学没用过[requestAnimationFrame],(https://developer.mozilla.org/zh-CN/docs/Web/API/Window/requestAnimationFrame),建议先去了解一下,当然你也可以用计时器来代替,不写也是可以的。
三、优化代码
虽然上诉方式已经将渲染时间缩短了,但是我们想要的效果是,需要的时候再渲染这个元素,不需要/被隐藏的元素就不渲染。那么这该怎么实现呢,首先我们去监听进度条,根据进度条滚动的距离,渲染dom,那么上诉代码就会变成如下样子。
<ul style="overflow: auto; height:400px;"></ul>
const $UL = document.querySelector('ul')
let page_arg = {size: 0,count: 100,
}const myList = getList()
$UL.onscroll = function () {if (this.scrollTop + this.clientHeight + 10 >= this.scrollHeight) {splitList()}
}// 生成数据
function getList() {let list = []for (let i = 0; i < 10000000; i++) {list.push('我是数据'+i)}return list
}function render(list) {let tempBox = document.createDocumentFragment()list.map(function (data) {let li = document.createElement('li')li.innerHTML = datatempBox.appendChild(li)})$UL.append(tempBox)
}function splitList() {render(myList.slice(page_arg.size, page_arg.size + page_arg.count))page_arg.size += page_arg.count
}splitList()
总结
写到这里渲染数据列表的问题就算是结束了,如果有什么地方写的不对,或者还能优化的地方还请各位大佬指出来,毕竟我也是第一次尝试渲染这么多数据,代码在这里,各位也可以自己去尝试一下。其实还可以在优化一下这个计算的时间,可以使用web Worker多开一个线程来协助计算,再次将js的计算时间压缩,不过对我来说已经足够了,对于追求性能的同学可以去尝试一下。然后分享一下自己的心得。嘿嘿,ok,这篇博客就到此为止了,谢谢各位的支持,有问题请私信我。
js渲染10万数据列表,不阻塞UI相关推荐
- 为何插入10万数据只需2秒
文章目录 一.前言 二.问题 1.url后面useServerPrepStmts是什么? 2.url后面rewriteBatchedStatements是什么? 3.这两个参数对语句执行有什么影响? ...
- php 导出excel分段导出_php 导出excel 10万数据
php导出excel 10万数据(此代码主要测试用,没写单元测试 还在修改中 后期加上单元测试) 在工作当中要对一些基本信息和其他信息导出 起初信息比较小无所谓.... 但当信息超出65535的时候 ...
- leaflet大量marker卡顿_leaflet如何加载10万数据
作为一名GIS开发者,你工作中一定遇到过这种问题,根据业务设计,需要在地图上添加1万+条数据,数据或是点.或是线.或是面.但不管哪种,当你添加到5000条时,地图操作就会出现明显的卡顿.当你添加超过1 ...
- js 渲染十万条数据卡顿优化方法。请求帧渲染
函数: 1.window.requestAnimationFrame(callback) callback:下一次重绘之前更新动画帧所调用的函数(即上面所说的回调函数). 作用:告诉浏览器--你希望执 ...
- 爬取B站10万数据,看看都有哪些热门的UP主
要点: - 爬取10万用户数据 - 数据存储 - 数据词云分析 1.准备阶段 写代码前先构思思路:既然我要爬取用户关注的用户,那我需要存储用户之间的关系,确定谁是主用户,谁是follower. 存储关 ...
- 调研3家学校,分析10万数据,发现有了大数据再也不用“清考”
今天看到了一篇新闻,让小编我惊出了一身冷汗,还好我毕业早: "清考"就是学校为了保证毕业率,在毕业前为那些还有课程挂科的学生一次补考的机会,而且补考比较容易通过." 通知 ...
- 数据库超10万数据导出Excel
ps: 首先科普一下基础知识 Excel 2003及以下的版本.一张表最大支持65536行数据,256列.也就是说excel2003完全不可能满足百万数据导出的需求. Excel 2007-2010版 ...
- 广西行政村数据shp_广西自治区乡镇行政区划数据 精度1:10万
原标题:广西自治区乡镇行政区划数据 精度1:10万 数据简介 行政区划是国家为了进行分级管理而实行的区域划分.中国现行六级行政区,即省级.地级.县级.乡级.村级.组级,其中省.县.乡三级为基本行政区. ...
- 300万数据的导入导出
进入了一个公司实习,要求自己写一个基于spring boot,用JPA实现的增删改查的小项目,前台用bootstrap,期间叫我们研究一下vue.js.第一次听说这个js框架的时候没有什么概念,只知道 ...
最新文章
- 基于HTML5的电信网管3D机房监控应用
- HDU2544 最短路(模版题dijkstra/floyd/spfa)
- 64位windows7配置32位odbc
- python3 类的一个实例
- 数据库SQL ServerSQL Server教程:详细学习游标
- 基于TableStore的数据采集分析系统介绍 1
- stats | 数据降维之主成分分析(PCA)
- 使用WITH AS提高性能简化嵌套SQL
- c++最小的引用()demo
- 编程成长日记——折半查找
- 梦记录:1204(梦到观世音菩萨像)
- 程序员代码大全c语言,程序员大神教你,新手零基础学C语言编程代码训练
- rose ha 的使用
- Java基础之《JDK文档》
- Cygwin、Msys、MinGW、Msys2的区别与联系
- python文件下载
- C++语言程序设计第五版 - 郑莉(第六章课后习题)
- OWASP ZAP安全测试工具使用教程(初级)
- Pandas+Pyecharts | 2022年世界500强数据分析可视化
- 计算机应用程序没声音,电脑如何关闭某个应用程序的声音
热门文章
- [转]linux grep命令的使用
- 机器学习笔记--PR曲线和ROC曲线
- 追踪社保基金操盘者的足迹
- 美国软件和菜头——《软件随想录》读后感
- python爬虫网易云音乐评论再分析_Scrapy爬取网易云音乐和评论(一、思路分析)...
- Machine Learning Approach to RF Transmitter Identification
- 弘辽科技:如何快速提升抖音小店
- 我的通宵史-网上斗地主谋生
- 基于51单片机的多路多点温度检测两种供电方式proteus仿真原理图PCB
- 基于单片机烟雾及温度报警器-火灾监测-毕设课设资料