mysql虚拟列表_「前端进阶」高性能渲染十万条数据(虚拟列表)

本文介绍了如何使用虚拟列表技术解决前端渲染大量数据时的性能问题。虚拟列表只渲染可视区域的数据,减少了样式计算和布局的时间消耗,提高了渲染效率。通过计算滚动位置,动态加载和删除列表项,实现高效渲染。文章还探讨了动态高度列表项的处理方法,并提供了基于Vue2.x的虚拟列表组件示例。
摘要由CSDN通过智能技术生成

前言

在工作中,有时会遇到需要一些不能使用分页方式来加载列表数据的业务情况,对于此,我们称这种列表叫做长列表。比如,在一些外汇交易系统中,前端会实时的展示用户的持仓情况(收益、亏损、手数等),此时对于用户的持仓列表一般是不能分页的。

在高性能渲染十万条数据(时间分片)一文中,提到了可以使用时间分片的方式来对长列表进行渲染,但这种方式更适用于列表项的DOM结构十分简单的情况。本文会介绍使用虚拟列表的方式,来同时加载大量数据。

为什么需要使用虚拟列表

假设我们的长列表需要展示10000条记录,我们同时将10000条记录渲染到页面中,先来看看需要花费多长时间:

button

document.getElementById('button').addEventListener('click',function(){//记录任务开始时间

let now =Date.now();//插入一万条数据

const total = 10000;//获取容器

let ul = document.getElementById('container');//将数据插入容器中

for (let i = 0; i < total; i++) {

let li= document.createElement('li');

li.innerText= ~~(Math.random() *total)

ul.appendChild(li);

}

console.log('JS运行时间:',Date.now() -now);

setTimeout(()=>{

console.log('总运行时间:',Date.now() -now);

},0)//print JS运行时间: 38

//print 总运行时间: 957

})

当我们点击按钮,会同时向页面中加入一万条记录,通过控制台的输出,我们可以粗略的统计到,JS的运行时间为38ms,但渲染完成后的总时间为957ms。

简单说明一下,为何两次console.log的结果时间差异巨大,并且是如何简单来统计JS运行时间和总渲染时间:

在 JS 的Event Loop中,当JS引擎所管理的执行栈中的事件以及所有微任务事件全部执行完后,才会触发渲染线程对页面进行渲染

第一个console.log的触发时间是在页面进行渲染之前,此时得到的间隔时间为JS运行所需要的时间

第二个console.log是放到 setTimeout 中的,它的触发时间是在渲染完成,在下一次Event Loop中执行的

关于Event Loop的详细内容请参见这篇文章-->

然后,我们通过Chrome的Performance工具来详细的分析这段代码的性能瓶颈在哪里:

2bc5184417e80b19bf7fdde768f69eb6.gif

从Performance可以看出,代码从执行到渲染结束,共消耗了960.8ms,其中的主要时间消耗如下:

Event(click) : 40.84ms

Recalculate Style : 105.08ms

Layout : 731.56ms

Update Layer Tree : 58.87ms

Paint : 15.32ms

从这里我们可以看出,我们的代码的执行过程中,消耗时间最多的两个阶段是Recalculate Style和Layout。

Recalculate Style:样式计算,浏览器根据css选择器计算哪些元素应该应用哪些规则,确定每个元素具体的样式。

Layout:布局,知道元素应用哪些规则之后,浏览器开始计算它要占据的空间大小及其在屏幕的位置。

在实际的工作中,列表项必然不会像例子中仅仅只由一个li标签组成,必然是由复杂DOM节点组成的。

那么可以想象的是,当列表项数过多并且列表项结构复杂的时候,同时渲染时,会在Recalculate Style和Layout阶段消耗大量的时间。

而虚拟列表就是解决这一问题的一种实现。

什么是虚拟列表

虚拟列表其实是按需

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值