面试(进阶) —虚拟列表在什么场景使用,如何实现?


面试(进阶)虚拟列表在什么场景使用,如何实现?


在前端开发中,当需要渲染大量数据时,传统的渲染方式往往会遇到性能瓶颈。一次性将大量数据渲染到DOM中,不仅会导致页面加载缓慢,还可能占用大量内存,影响浏览器的响应速度。为了解决这个问题,虚拟列表(Virtual List)技术应运而生。


在这里插入图片描述

虚拟列表的定义

虚拟列表是一种优化长列表渲染的技术。它的核心思想是:只渲染当前视口(viewport)内可见的数据项,而非一次性渲染所有数据。通过动态计算视口内应显示的数据项,虚拟列表能够显著减少DOM节点的数量,从而提高页面的渲染性能和交互流畅度。

虚拟列表的关键点

  1. 视口计算:确定当前视口的大小和位置,以及每个列表项的高度。
  2. 数据截取:根据视口的位置和大小,从数据源中截取应显示的数据项。
  3. DOM渲染:仅将截取的数据项渲染到DOM中。
  4. 滚动监听:监听用户的滚动操作,实时更新视口的位置,并重新渲染可见的数据项。

虚拟列表的实现原理

虚拟列表的实现通常涉及以下几个步骤:

  1. 计算视口高度和列表项高度:这是为了确定在视口内能够显示多少个列表项。
  2. 确定起始和结束索引:根据滚动条的位置和列表项的高度,计算出当前视口内应显示的起始和结束数据索引。
  3. 渲染数据:根据计算出的起始和结束索引,从数据源中截取相应部分的数据进行渲染。
  4. 更新视口:监听滚动事件,当用户滚动列表时,重新计算起始和结束索引,并更新渲染的内容。

Vue版本案例代码

下面是一个使用Vue.js实现的虚拟列表示例:

<template><div id="app"><div class="container" ref="container" @scroll="handleScroll"><divclass="item"v-for="(item, index) in visibleItems":key="index":style="{ top: `${(startIndex + index) * itemHeight}px` }">{{ item }}</div></div></div>
</template><script>
export default {data() {return {items: [], // 数据源itemHeight: 30, // 每个列表项的高度containerHeight: 300, // 容器高度startIndex: 0, // 当前视口的起始索引endIndex: 0, // 当前视口的结束索引};},computed: {visibleItems() {// 计算当前视口内应显示的数据项return this.items.slice(this.startIndex, this.endIndex);},},mounted() {// 初始化数据源this.items = Array.from({ length: 1000 }, (_, i) => `Item ${i + 1}`);this.updateVisibleItems();},methods: {updateVisibleItems() {// 更新视口内的起始和结束索引const container = this.$refs.container;const totalItems = this.items.length;const displayedItems = Math.ceil(this.containerHeight / this.itemHeight);this.startIndex = Math.max(0, Math.floor(container.scrollTop / this.itemHeight));this.endIndex = Math.min(totalItems, this.startIndex + displayedItems);},handleScroll() {// 监听滚动事件,更新可见数据项this.updateVisibleItems();},},
};
</script><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;text-align: center;color: #2c3e50;margin-top: 60px;
}.container {height: 300px;overflow-y: auto;border: 1px solid #ccc;position: relative;
}.item {height: 30px;border-bottom: 1px solid #eee;padding: 5px;box-sizing: border-box;position: absolute;width: 100%;
}
</style>

解析描述

模板部分

  • 使用<div>元素作为容器,并绑定了滚动事件监听器。
  • 使用v-for指令循环渲染可见的数据项,并通过:style绑定动态设置每个列表项的顶部位置。

脚本部分

  • 定义了数据源items,每个列表项的高度itemHeight,容器高度containerHeight,以及当前视口的起始和结束索引startIndexendIndex
  • mounted生命周期钩子中初始化数据源,并调用updateVisibleItems方法更新可见数据项。
  • 定义了updateVisibleItems方法,用于根据滚动条的位置更新视口内的起始和结束索引。
  • 定义了handleScroll方法,监听滚动事件并调用updateVisibleItems方法更新可见数据项。

样式部分

  • 为容器和列表项设置了样式,包括高度、边框、滚动条等。
  • 使用position: absolute;为列表项设置绝对定位,以便根据起始索引动态调整每个列表项的位置。

通过这个Vue版本的虚拟列表实现,我们可以更加直观地理解虚拟列表的工作原理和实现方式。在实际应用中,还可以根据需要进行进一步优化和扩展,如支持动态调整列表项高度、处理大量数据时的性能优化等。



虚拟列表的优缺点

优点

  1. 性能提升:虚拟列表通过只渲染可视区域内的项,显著减少了DOM元素的数量,从而提高了页面的渲染效率和响应速度。这对于处理大量数据(如十万、百万级别)的列表尤其有效。
  2. 内存优化:由于只渲染可见区域内的元素,虚拟列表节省了内存消耗,避免了大规模数据的全部渲染,有助于提升应用的性能。
  3. 流畅体验:用户滚动列表时,虚拟列表可以实现流畅的加载和切换,减少了页面卡顿现象,提升了用户体验。

缺点

  1. 实现复杂度:虚拟列表的实现相对复杂,需要开发者具备一定的前端技术基础,包括DOM操作、事件监听、计算逻辑等。
  2. 兼容性:在某些特殊情况下,虚拟列表可能与某些CSS样式或布局方式存在兼容性问题,需要开发者进行额外的调试和优化。

比较

列表类型渲染方式优缺点适用场景
虚拟列表只渲染可视区域内的项优点:性能高、内存占用少、用户体验流畅;缺点:实现复杂、可能存在兼容性问题处理大量数据的列表,如聊天记录、商品列表、评论区等
普通列表一次性渲染所有数据项优点:实现简单;缺点:性能低、内存占用高、用户体验可能卡顿数据量较小的列表,如导航菜单、标签页等
分页列表分批次加载数据并渲染优点:减少单次加载的数据量,提升性能;缺点:用户需要手动翻页,体验可能不如虚拟列表流畅数据量较大的列表,且希望减少单次加载压力的情况
无限滚动列表用户滚动到底部时加载更多数据优点:用户体验较为流畅,无需手动翻页;缺点:可能存在性能问题,尤其是在数据量非常大的情况下希望提供连续滚动体验的场景,如新闻资讯、社交媒体等

分析

  • 普通列表适用于数据量较小的场景,实现简单但性能较低。
  • 分页列表通过分批次加载数据来减少单次加载的压力,适用于数据量较大的情况,但用户需要手动翻页,体验可能不如虚拟列表流畅。
  • 无限滚动列表提供了连续滚动的体验,适用于希望用户能够连续浏览的场景,但在数据量非常大的情况下可能存在性能问题。
  • 虚拟列表则通过只渲染可视区域内的项来显著提升性能和用户体验,特别适用于处理大量数据的列表场景。然而,其实现相对复杂,且可能存在兼容性问题。

在选择列表类型时,开发者应根据具体的应用场景、数据量、性能要求以及用户体验需求进行综合考虑。

看到这里的小伙伴,欢迎点赞、评论,收藏!

如有前端相关疑问,博主会在第一时间解答,也同样欢迎添加博主好友,共同进步!!!

在这里插入图片描述

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

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

相关文章

Linux Mem -- 关于AArch64 MTE功能的疑问

目录 1.虚拟地址和物理地址映射完成后&#xff0c;才可以设置虚拟地址对应的memory tag &#xff1f; 2.各种memory allocator中的address tag从哪来&#xff0c;怎么产生&#xff1f; 2.1 vmalloc allocator 2.2 slub分配器 2.3 用户可以指定IRG指令产生的address tag 3.kasan…

python-leetcode-颜色分类

75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; class Solution:def sortColors(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""low, mid, high 0, 0, len(nums) - 1while mid < h…

ArcGIS Pro技巧实战:高效矢量化天地图地表覆盖图

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;地表覆盖图的矢量化是一项至关重要的任务。天地图作为中国国家级的地理信息服务平台&#xff0c;提供了丰富且详尽的地表覆盖数据。然而&#xff0c;这些数据通常以栅格格式存在&#xff0c;不利于进行空间分析和数据…

【江科大STM32】TIM输出比较(学习笔记)

本章图片文字内容也为重要知识&#xff0c;请马住&#xff01; 输出比较简介 OC&#xff08;Output Compare&#xff09;输出比较输出比较可以通过比较CNT与CCR寄存器值的关系&#xff0c;来对输出电平进行置1、置0或翻转的操作&#xff0c;用于输出一定频率和占空比的PWM波形…

【网络安全 | 漏洞挖掘】利用文件上传功能的 IDOR 和 XSS 劫持会话

未经许可,不得转载。 本文涉及漏洞均已修复。 文章目录 前言正文前言 想象这样一个场景:一个专门处理敏感文档的平台,如保险理赔或身份验证系统,却因一个设计疏漏而成为攻击者的“金矿”。在对某个保险门户的文件上传功能进行测试时,我意外发现了一个可导致大规模账户接管…

飞算 JavaAI 如何让微服务开发快人一步?

在当今竞争激烈的软件开发领域&#xff0c;微服务架构因其灵活性和可扩展性备受青睐。然而&#xff0c;微服务开发过程复杂&#xff0c;从需求分析到最终代码实现&#xff0c;每个环节都需要耗费大量时间和精力。飞算 JavaAI 的出现&#xff0c;犹如一道曙光&#xff0c;为开发…

Python—Excel全字段转json文件(极速版+GUI界面打包)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码(简易版)5、进阶版(GUI)总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——…

2025年光电科学与智能传感国际学术会议(ICOIS 2025)

重要信息 官网&#xff1a;www.ic-icois.org 时间&#xff1a;2025年3月14-16日 地点&#xff1a;中国-长春 简介 2025年光电科学与智能传感国际学术会议&#xff08;ICOIS 2025&#xff09;将于2025年3月14-16日在中国-长春隆重召开。会议将围绕“光学光电”、“智能传感”…

企业微信里可以使用的企业内刊制作工具,FLBOOK

如何让员工及时了解公司动态、行业资讯、学习专业知识&#xff0c;并有效沉淀企业文化&#xff1f;一份高质量的企业内刊是不可或缺的。现在让我来教你该怎么制作企业内刊吧 1.登录与上传 访问FLBOOK官网&#xff0c;注册账号后上传排版好的文档 2.选择模板 FLBOOK提供了丰富的…

YOLOv5 + SE注意力机制:提升目标检测性能的实践

一、引言 目标检测是计算机视觉领域的一个重要任务&#xff0c;广泛应用于自动驾驶、安防监控、工业检测等领域。YOLOv5作为YOLO系列的最新版本&#xff0c;以其高效性和准确性在实际应用中表现出色。然而&#xff0c;随着应用场景的复杂化&#xff0c;传统的卷积神经网络在处…

跟我学C++中级篇——定时器的设计

一、定时器 谈到定时器&#xff0c;理论上讲是各种语言和各种设计都无法避开的一个技术点。对于定时器来说&#xff0c;表面上就是一种时间间隔的处理约定&#xff0c;但对程序来说&#xff0c;可能就是设计层面、接口层面和库或框架以及系统应用的一个大集合。不同的系统&…

智能机器人加速进化:AI大模型与传感器的双重buff加成

Deepseek不仅可以在手机里为你解答现在的困惑、占卜未来的可能&#xff0c;也将成为你的贴心生活帮手&#xff01; 2月21日&#xff0c;追觅科技旗下Dreamehome APP正式接入DeepSeek-R1大模型&#xff0c;2月24日发布的追觅S50系列扫地机器人也成为市面上首批搭载DeepSeek-R1的…

PostgreSQL10 逻辑复制实战:构建高可用数据同步架构!

PostgreSQL10 逻辑复制实战&#xff1a;打造高可用数据同步架构&#xff01; 概述 PostgreSQL 10 引入了逻辑复制&#xff08;Logical Replication&#xff09;&#xff0c;为数据库高可用和数据同步提供了更灵活的选择。PostgreSQL 复制机制主要分为物理复制和逻辑复制两种&…

LVS+Keepalived高可用群集配置案例

以下是一个 LVSKeepalived 高可用群集配置案例&#xff1a; 1、环境准备 LVS 主调度器&#xff08;lvs1&#xff09;&#xff1a;IP 地址为 192.168.8.101&#xff0c;心跳 IP 为 192.168.4.101LVS 备调度器&#xff08;lvs2&#xff09;&#xff1a;IP 地址为 192.168.8.102…

原生家庭独立的艺术:找到自我与家庭的平衡点

原生家庭独立的艺术&#xff1a;找到自我与家庭的平衡点 &#x1f331; 引言 &#x1f308; 小林刚刚和父母结束了一次激烈的电话对峙。父母坚持认为他应该回到家乡工作&#xff0c;“这样我们也能照顾你”&#xff0c;而他则努力解释自己在大城市的职业规划。挂掉电话后&…

Java进阶——注解一文全懂

Java注解&#xff08;Annotation&#xff09;是一种强大的元数据机制&#xff0c;为代码提供了附加信息&#xff0c;能简化配置、增强代码的可读性和可维护性。本文将深入探讨 Java 注解的相关知识。首先阐述了注解的基础概念&#xff0c;包括其本质、作用以及核心分类&#xf…

DeepSeek 15天指导手册——从入门到精通 PDF(附下载)

DeepSeek使用教程系列--DeepSeek 15天指导手册——从入门到精通pdf下载&#xff1a; https://pan.baidu.com/s/1PrIo0Xo0h5s6Plcc_smS8w?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/2e8de75027d3 《DeepSeek 15天指导手册——从入门到精通》以系统化学习路径为核心&…

【智能音频新风尚】智能音频眼镜+FPC,打造极致听觉享受!【新立电子】

智能音频眼镜&#xff0c;作为一款将时尚元素与前沿科技精妙融合的智能设备&#xff0c;这种将音频技术与眼镜形态完美结合的可穿戴设备&#xff0c;不仅解放了用户的双手&#xff0c;更为人们提供了一种全新的音频交互体验。新立电子FPC在智能音频眼镜中的应用&#xff0c;为音…

常用的 pip 命令

pip 是 Python 的包管理工具&#xff0c;可用于安装、卸载、更新和管理 Python 包。以下是一些常用的 pip 命令&#xff1a; 1. 安装包 安装最新版本的包 pip install package_namepackage_name 是你要安装的 Python 包的名称&#xff0c;例如 pip install requests 可以安装…

学习threejs,使用ShaderMaterial自定义着色器材质

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.ShaderMaterial1.1.1…