当页面渲染太多标签时,会出现卡顿的,典型就是类似table数据太多时,非常卡顿。如果选择分页,没必要讨论,这儿只讨论采用滚动的情况。解决思路很简单,就是页面不展示出来的元素,从页面上删除掉,最难点在于滚动条的处理,这儿分享一些细节思路,以上下滚动为例。

上下滚动表格

  1. 每一行固定高度,一次性获取所有数据。
  2. 每一行不固定高度,一次性获取所有数据。
  3. 每一行不固定高度,分批获取数据。
    首先,布局如下:

当只显示可视区的内容时,overflow的标签需要删除掉,但是删除了之后,滚动条会变化,甚至消失,因此可添加padding-top和padding-bottom,以此模拟内容高度。

第一类,所有数据都能根据计算获得,需要一个scrollTop对应的显示数据的对照表,当滚动条位置变化时,去对照表种查看需要显示的数据,以此来渲染。当然不是每个scrollTop都去生成对照表,只需要某个范围生成就行了,比如:[{2000:显示数据}, {5000: 显示数据}](表示分别表示 0-2000,2000-5000显示的数据) 去对比第一个大于scrollTop的数据,获取其值,就是需要显示的数据。

** 这儿需要注意的是,显示数据必须有重复,且重复能占满屏幕以上,避免出现空白(第一次是0-100条,第二次是80-180条)*

第二类,就不好计算了,比如某一格里面内容太多,会令整行高度增加。可采用隐藏标签(opacity:0),循环渲染每一行,拿到那一行的高度。此种方式简单,也容易实现,不过计算渲染数据时,保证屏幕不出现空白的计算会复杂一点。隐藏标签渲染时,使用分批渲染,比如每次渲染10行,使用 requestAnimationFrame,setTimeout或者promise处理一下,不至于卡死。

第三类,只知道当前数据是多少,无法计算总高度。可以采取与第二种类似的方式,使用隐藏标签计算出每一行的高度,最终计算出得到数据的总高度。当滚动条滚到某个值时,触发后续数据获取。一样的方式,重新计算出总高度。

所有方法都有个前提,就是每一行数据渲染是同步的,有些情况是先渲染出框,等获取数据后填充框。这种类似table的布局,会非常麻烦,需要设置一个回调函数,等所有数据渲染完成后再获取高度。

还有一种方式,或许会更简单,但是效果上会差一些。方法就是在滚动条距离底部某个位置的时候,触发记录:

  1. 记录这一批次每一行元素的offsetTop
  2. 计算出此批次数据对照的scrollTop以及此批次数据对应的scrollHeight
  3. 记录scrollHeight(往回滚动时用)。还需要在

此时切换数据,新批次数据必须有重复数据,避免空白。这样就可以边滚动,边记录,最终记录完成所有行数据的offsetTop,scrollTop范围对应的批数据,以及此批的scrollHeight。父元素的paddingTop永远是那批次数据第一行的offsetTop,而最大的scrollHeight - 当前批

次数据的scrollHeight = paddingBottom。

其他优化,如果是vue,可以使用Object.freeze() 冻结只需要显示的数据。

js 大量数据优化,通用方法的更多相关文章

  1. 我在一个前端项目中用js整理的一些通用方法,其中使用到的思想,主要就是约定了。

    把名称和后台来的json数据约定起来,可以达到的效果就是可以将东西统一化,减少差异,提升模块等的通用性,此后就可以实现具体不同模块内容可以自动或拷贝赋值的方式 2016.7.18 refactor s ...

  2. js文件流下载通用方法

    通常我们会用到文件流下载文件,下面给大家一个通用的文件流下载的js /* *下载文件 * options:{ * url:'', //下载地址 * isNewWinOpen:false,是否新窗口打开 ...

  3. mysql使用模板解决旧数据处理,默认初始化数据的通用方法!

    一 业务介绍 先来看看我这得大致业务需求,这次业务比较简单: 即从现在开始,每次new一个爷爷都需要默认初始化给这个爷爷三个儿子(子表,爷爷id去关联),并在初始化每个儿子的同时再给每个儿子初始化若干 ...

  4. js写的一些通用方法

    Js获取当前浏览器支持的transform兼容写法 // 获取当前浏览器支持的transform兼容写法 function getTransfrom() { var transform = '', / ...

  5. SQL 优化通用方法

    1. 尽量避免用sub-queres, 可以采用join代替 2. exists代替in not exists 和not in 这两个的性能值得深究,应该不是差太多 3. 索引优化 4. 一些操作会导 ...

  6. Web 性能优化: 使用 Webpack 分离数据的正确方法

    摘要: Webpack骚操作. 原文:Web 性能优化: 使用 Webpack 分离数据的正确方法 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 制定向用户提供文件的最佳方式可能是一 ...

  7. DataTable数据赋值给Model通用方法

    注:该文属本人原创,今后项目中发现该方法存在BUG会实时更新,转载记得附上原文出处,方便大家获得最新代码. 相信大家在做项目中,经常会根据不同的表new各种不同的Model,当需要对Model进行实例 ...

  8. DB-SQL-MySQL-杂项-调优:Mysql千万以上数据优化、SQL优化方法

    ylbtech-DB-SQL-MySQL-杂项-调优:Mysql千万以上数据优化.SQL优化方法 1.返回顶部 1. 1,单库表别太多,一般保持在200以下为宜 2,尽量避免SQL中出现运算,例如se ...

  9. js删除数据的几种方法

    js 删除数组几种方法 var arr=['a','b','c']; 若要删除其中的'b',有两种方法: 1.delete方法:delete arr[1] 这种方式数组长度不变,此时arr[1]变为u ...

随机推荐

  1. 深入了解String和intern

    引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8 ...

  2. 对API进行版本控制的重要性和实现方式

    我在API设计中收到的最常见问题之一就是如何对API进行版本控制.虽然并非所有API都完全相同,但我发现在API版本控制方面,某些模式和实践适用于大多数团队.我已经将这些内容收集起来,下面将提供一些关 ...

  3. 用jquery实现放大镜效果

    ----css代码--- *{margin:0;padding:0;} .showimg{position:relative;width:450px;height:420px;border:1px s ...

  4. 转载 | CSS图片下面产生间隙的 6种解决方案

    在进行页面的DIV+CSS排版时,遇到IE6(当然有时Firefox下也会偶遇)浏览器中的图片元素img下出现多余空白的问题绝对是常见的对於 该问题的解决方法也是「见机行事」,根据原因的不同要用不同的 ...

  5. 同“窗”的较量:部署在 Windows 上的 .NET Core 版博客站点发布上线

    为了验证 docker swarm 在高并发下的性能问题,周一我们发布了使用 docker-compose 部署的 .net core 版博客站点(博文链接),但由于有1行代码请求后端 web api ...

  6. SpringBoot:Mybatis + Druid 数据访问

    西部开源-秦疆老师:基于SpringBoot 2.1.7 的博客教程 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处!防君子不防小人,共勉! 简介 对于数据访问层 ...

  7. Android OTG之USB转串口模块通讯

    微信公众号:CodingAndroid CSDN:http://blog.csdn.net/xinpengfei521 1.背景简介 我们公司开发了一款室内机平板APP应用,要求平板能去控制智能门锁. ...

  8. 使用rpm安装指定版本的docker(1.12.6)

    一.原因 如果系统是Centos7.3,直接使用yum install docker安装的docker版本是1.13.1,导致在创建容器的会报错,错误如下: 所以为了防止安装高版本的docker引发的 ...

  9. 防止Web攻击,做好HTTP安全标头

    前言   下图是几年前一位女性在访谈会上提问Linus(Linux操作系统之父) 为什么英伟达显卡在Linux系统中兼容性这么差? Linus说他们曾经去和英伟达谈过关于显卡在Linux上兼容的问题, ...

  10. C#之BackgroundWorker从简单入门到深入精通的用法总结

    需求分析 经常用到的耗时操作,例如: 1.文件下载和上载(包括点对点应用程序传输文件,从网络下载文件.图像等)2.数据库事务(从数据库读到大量的数据到WinForm界面中的DataGridview里呈 ...