十万条数据,后端不分页咋办!(如何优化长列表渲染)

news2024/11/24 7:37:53

十万条数据,后端不分页咋办!(如何优化长列表渲染)

长列表是什么?

  • 我们通常把一组数量级很大的数据叫做长列表,比如渲染一组上千条的数据,我们以数组的形式拿到这些信息,然后遍历渲染在页面上;

长列表应该如何渲染?

  • 面对这种大量的数据我们通常会采取分页拉取的形式来优化用户体验,比如直截了当的分页器,或者无限滚动,再配合懒加载等方式,这样能够满足大部分长列表的场景
  • 但是当我们面对的数据量巨大且无法分页拉取时,上面说的方法就不好用了;在一个移动端的页面上呈现成千上万个dom,除了请求时的挑战,渲染时对于用户的设备性能也是一个极大的考验。
  • 我尝试在一个页面中渲染近万条数据
  • img
  • 最直观可以看到的是,在真实列表中产生了十万多个节点。虽然我们创建DOM这件事本身很简单,但是每个dom都会增加页面在内存、布局、样式、绘制方面额外的成本。如果网页的dom过多会导致低端设备变得卡顿甚至无法使用。(Admittedly, DOM nodes themselves are cheap, but they are not free, as each of them adds extra cost in memory, layout, style and paint. Low-end devices will get noticeably slower if not completely unusable if the website has too big of a DOM to manage.)
  • 在这里尝试一种虚拟列表的渲染形式,明显的可以看到,在页面中只产生了几百个dom节点,大大提升了页面的渲染性能
  • img

虚拟列表的实现原理

  • 虚拟列表实际上就是一种按需渲染的操作。我们在渲染上万条数据时,只需要渲染可视区当中的元素,当页面发生滚动时,监听元素并进行替换,从而达到在上万上亿条数据面前,被页面渲染的也只有不过几百个节点,达到优化长列表大数据渲染的目的。

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kUw9MHbB-1684195828128)(https://ask.qcloudimg.com/http-save/4611443/c7b08e5f613255e088e8ff99b98377f9.gif)]

  • 如何实现一个虚拟列表,实际上就是在首屏加载的时候,只加载 可视区域 内需要的元素,当页面滚动时,再动态计算需要被渲染的元素,删除掉消失在视窗中的元素,保持总数一致。

  • 
    
  • 前面我们看到在虚拟列表渲染中,只渲染了可视区的数据,所以为了让页面能够正常的滚动,我们需要一个占位的元素,在上面代码的DOM结构中mod-wraper充当可视区的角色,mod-phantom是我们的占位元素,用来形成滚动条,mod-realList才是我们真正渲染出来的元素列表。我们需要定义一些变量来计算该出现在视窗中的数据。

  • // 假定需要渲染的数据为 listData[] , 每个元素的高度为 itemHight, 占位Dom的滚动距离为scrollTop; 
    const wrapperHight = X; //视窗高度 
    const seatListHeight = list.length * itemHight; //占位Dom高度 
    const visibleCount = Math.ceil(wrapperHight / itemHeight); // 可视元素数量 
    const startIndex = Math.floor(scrollTop / itemHeight); // 起始元素 
    const endIndex = startIndex + visibleCount; // 终止元素 
    const startOffset = scrollTop; //列表偏移量 
    const visibleData = listData.slice(startIndex, endIndex); //可视区域数据
    
  • 我们可以利用视窗的高度计算出此时视窗中的开始元素与结束元素,对listData进行裁剪。监听mod-phantom的滚动条数据对mod-realList进行translate,使页面看起来实现了真正的滚动。

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jmgs0of5-1684195828129)(https://ask.qcloudimg.com/http-save/4611443/40e095a671c55d55cb5ba818f21a4ed8.gif)]

  • 真实的使用案例当中,我们不会只是渲染一个列表,还会存在其他元素以及宽高的不缺定性,那我们就需要设置更多的变量去进行计算。比如页面中的头部和底部数据,封装好的组件不一定能满足我们的需求,所以只有掌握了才能更好的应用于开发当中。

优化思路

  • 由于虚拟列表是实时生成dom,所以有一定回流和重绘的成本,并且由于我们用监听滚动条来实现‘假装滚动’,Rander进程无法及时更新视图,所以在用户滑动过快时会产生页面上只剩背景的问题,我们可以通过提前渲染一些元素来缓解这个问题,比如提前渲染100条,这样用户滑得再快也不会看到白屏了。
  • 说到了提前渲染,我们也可以使用这种方式去动态监听不定宽高的列表场景。

适用场景

  • 说了这么多感觉虚拟列表是不是很厉害,其实通过实践发现,在几百条数据的情况下,虚拟列表与真实Dom的渲染速率毫无差别。所以我们这里所说的长列表,是几千几万条数据的情况下。
  • 转载至 https://cloud.tencent.com/developer/article/2064523

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rust快速安装

Rust依赖C编译,Rust官方推荐的安装方式是利用VisualSudio安装C环境,VisualStuidio用过的都懂,庞大无比、卡顿、下载还贼慢(我当时装了一上午好像),因此我们通过其它方式配置C 安装C环境 下载MinGW 64 win32 seh Mingw官网&…

Java的并发集合框架

文章目录 一、并发集合框架1. 简介2. 接口Iterable2. 接口Collection3. 接口List4. 接口Set5. 接口Queue6. Deque 二、非阻塞队列1. 概念2. ConcurrentHashMap使用(1)简介(2)验证HashMap不是线程安全的(3)验…

ld文件中指定变量在flash中的地址定义

本文说的是在gcc环境中,Keil或IAR可能有自己的使用方法。 我们在定义变量时,有时候需要把变量定义放到flash中的固定位置或区域,此时需要修改工程中的链接文件(link file,ld文件)。 方法一 修改ld文件中的…

软件IIC通信以及源码解析(如何使用)

以对读取MPU6050为例,解析如何采用IIC通信源码。 IIC的的通信,通常三种用途读写。分为: 1: 2: 3: 注:其中最常用的就是1和3了。 对1进行讲解: 指定地址写,通常用作对状…

【网络】- TCP/IP四层(五层)协议 - 网际层(网络层) - IP地址

目录 一、概述 二、IP地址的定义 三、IP地址由网络和主机两部分标识组成 一、概述 上篇文章简单介绍了网际协议IP。网际协议 IP 大致分为三大作用模块, ①IP寻址、 ②路由(最终节点为止的转发) 、③IP分包与组包。 这篇文章主要详细介绍IP地址…

【HTTP协议详解】

目录 1.什么是http2.抓包工具2.1 抓包工具2.2 抓包原理 3.Http协议格式3.1Http请求报文3.2Http响应报文的格式 4.请求报文格式4.1 报文首行4.2 请求报文header 5. 响应报文格式6.构造Http请求7.Https协议7.1 对称密钥7.2 非对称密钥7.3 证书 1.什么是http HTTP全称为“超文本协…

《MySQL是怎么运行的》阅读分享

mysql运行的整体架构简介 Mysql是由两部分构成,一部分是服务器程序,一部分是客户端程序。 服务器程序又包括两部分: 第一部分server层包括连接器、查询缓存、分析器、优化器、执行器等。涵盖 MySQL 的大多数核心服务功能,以及所有…

LeetCode:738.单调递增的数字 714.买卖股票的最佳时机含手续费 968.监控二叉树

738.单调递增的数字 题目 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 贪心 class Solution {public int monotoneIncrea…

数据结构——单链表(C语言)

在这⼀条⼗分漫长的路上&#xff0c;我⾛过阳关⼤道&#xff0c;也⾛过独⽊⼩桥。路旁有深⼭⼤泽&#xff0c;也有平坡宜⼈&#xff1b;有杏花春⾬&#xff0c;也有塞北秋风&#xff1b;有⼭重⽔复&#xff0c;也有柳暗花明&#xff1b;有迷途知返&#xff0c;也有绝处逢⽣。—…

[论文分享] Function Representations for Binary Similarity

Function Representations for Binary Similarity [TDSC 2022] Luca Massarelli , Giuseppe Antonio Di Luna, Fabio Petroni, Leonardo Querzoni, and Roberto Baldoni 二进制相似度问题在于仅考虑两个函数的编译形式来判断它们是否相似。近年来&#xff0c;计算二进制相似度…

【2023 · CANN训练营第一季】进阶班 Atlas 200I DK 智能小车

1 智能小车三维结构设计 1.1 基本模块 坚固酷炫结构模块运动控制模块超声波传感器模块摄像头视觉模块其他传感器模块 1.2 结构设计基本原则 从零开始设计并搭建智能小车&#xff0c;在满足外观要求的基础上&#xff0c;要满足小车运转过程中的运动干涉率为O&#xff0c;并且…

玩转ChatGPT:Show Me插件尝鲜

一、写在前面 之前&#xff0c;不少人问我GPT能否画技术路线图&#xff0c;然后看到了这个插件&#xff1a;Show Me&#xff1a; 简单问GPT这个插件的使用方法&#xff1a; 二、尝鲜过程 &#xff08;1&#xff09;用TA提供的例子试一试&#xff1a; 咒语&#xff1a;请用图…

009、实例连接访问控制

实例连接访问控制 1、实例连接访问控制概述2、pg_hba.conf文件3、名单格式4、pg_hba.conf 示例:5、当有重复或者冲突的时候1、实例连接访问控制概述 • 实例访问控制就像是一道防火墙,用它来控制来自于不同主机、不同用户是否 允许访问指定的数据库、以及验证方式。 2、pg…

【Tcp通信服务器流程】

TCP通信流程 1、服务器端&#xff08;被动接收连接的角色&#xff09; &#xff08;1&#xff09;创建一个用于监听的套接字 - 监听&#xff1a;监听有客户端的连接 - 套接字&#xff1a;这个套接字其实就是一个文件描述符 &#xff08;2&#xff09;将这个监听文件描述符和…

TextCNN文本分类

本文主要介绍TextCNN文本分类&#xff0c;主要从TextCNN的原理的Pytorch实现来逐步讲解。主要思想来自论文《Convolutional Neural Networks for Sentence Classification&#xff08;EMNLP2014&#xff09; 论文连接&#xff1a;[1408.5882] Convolutional Neural Networks f…

设计模式系列/ 职责链模式

必读 本篇主要分析设计模式之 职责链模式。 什么人适合学习本章节呢。 从未接触过设计模式的同学有n年工作经验 && 对职责链模式不了解的同学 1. 职责链模式意识形态 设计模式充斥着我们开发过程中的方方面面&#xff0c;责任链模式也是如此。也许你用到了设计模式&…

ElasticSearch-文档查询

目录 一、查询某个索引下的全部文档 二、根据查询条件查询文档 三、分页查询 四、查询指定返回的字段 五、排序 六、多条件查询 七、范围查询 八、全文检索与完全匹 一、查询某个索引下的全部文档 语法&#xff1a; GET /索引名称/_search {"query": {&quo…

[BJDCTF2020]Easy MD51

拿到题目后就一个空白页面&#xff0c;没啥特别的东西&#xff0c;传入参数也没啥变化 在查看源码无果后在响应头的找到了一份隐藏信息&#xff0c;应该就是页面对应的后端代码&#xff0c;我们提交的数据就是变量$pass的值 PHP中的MD5函数的意思是&#xff0c;将$pass变量的值…

LitCTF2023-部分Reserve复现

目录 一&#xff1a;[LitCTF 2023]snake pyc文件magic修复&#xff1a; pycdc工具转pyc文件为py文件&#xff1a; [LitCTF 2023]enbase64 [LitCTF 2023]ez_XOR [LitCTF 2023]For Aiur 在python38环境中将exe文件反编译为pyc文件 pycdc使用&#xff1a; [LitCTF 2023]程…

iptables防火墙1

iptables防火墙 iptables概述 Linux 系统的防火墙 &#xff1a;IP信息包过滤系统&#xff0c;它实际上由两个组件netfilter 和 iptables组成。 主要工作在网络层&#xff0c;针对IP数据包。体现在对包内的IP地址、端口、协议等信息的处理上。 netfilter/iptables 关系&#xf…