当前位置: 首页 > news >正文

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


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


在前端开发中,当需要渲染大量数据时,传统的渲染方式往往会遇到性能瓶颈。一次性将大量数据渲染到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样式或布局方式存在兼容性问题,需要开发者进行额外的调试和优化。

比较

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

分析

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

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

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

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

在这里插入图片描述

相关文章:

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

面试(进阶) —虚拟列表在什么场景使用&#xff0c;如何实现&#xff1f; 在前端开发中&#xff0c;当需要渲染大量数据时&#xff0c;传统的渲染方式往往会遇到性能瓶颈。一次性将大量数据渲染到DOM中&#xff0c;不仅会导致页面加载缓慢&#xff0c;还可能占用大量内存&#x…...

深入了解 NAT 模式:网络地址转换的奥秘

深入了解 NAT 模式&#xff1a;网络地址转换的奥秘 在计算机网络的世界里&#xff0c;NAT 模式&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;扮演着至关重要的角色。它就像是网络中的翻译官&#xff0c;在不同网络地址之间进行转换&#xff0…...

Android Studio 新版本Gradle发布本地Maven仓库示例

发布代码到JitPack示例&#xff1a;https://blog.csdn.net/loutengyuan/article/details/145938967 以下是基于 Android Studio 24.2.2&#xff08;Gradle 8.10.2 AGP 8.8.0 JDK17&#xff09; 的本地 Maven 仓库发布示例&#xff0c;包含aar和jar的不同配置&#xff1a; 1.…...

无服务边缘融合架构:重新定义云原生应用边界

引言&#xff1a;零部署计算的革命突破 Airbnb迁移至LambdaEdge架构后&#xff0c;全球客房详情页渲染延迟降至35ms&#xff0c;冷启动时间缩至50ms以内。Stripe采用无服务边缘计算处理支付事务&#xff0c;成功将动态API响应P99延迟从210ms压缩至19ms。AWS官方基准显示&#…...

数据库测试

TPCH 22条SQL语句分析 - xibuhaohao - 博客园 TPCH模型规范、测试说明及22条语句 - zhjh256 - 博客园 TPC-DS 性能比较&#xff1a;TiDB 与 Impala-PingCAP | 平凯星辰 揭秘Oracle TPC-H性能优化&#xff1a;如何提升数据库查询速度&#xff0c;揭秘实战技巧与挑战 引言 T…...

Nodejs-逐行读取文件【简易版】

“勤奋就是成功之母。”‌ —— 茅以升 目录 逐行读取文件四种方法&#xff1a;Node.js 逐行读取文件的核心方法&#xff1a;同步读取&#xff08;适用于小文件&#xff09;&#xff1a;异步流式处理&#xff08;推荐用于大文件&#xff09;&#xff1a;[使用 readline 模块](h…...

上海市计算机学会竞赛平台2024年5月月赛丙组城市距离之和

城市距离之和 内存限制: 256 Mb时间限制: 1000 ms 题目描述 设 (x,y)(x,y) 与 (x′,y′)(x′,y′) 是平面上的两个点的坐标&#xff0c;它们之间的城市距离定义为 ∣x−x′∣∣y−y′∣∣x−x′∣∣y−y′∣ 给定 nn 个点&#xff0c;请计算所有点对之间的城市距离之和。 …...

穷举vs暴搜vs深搜vs回溯vs剪枝(典型算法思想)—— OJ例题算法解析思路

回溯算法的模版 void backtrack(vector<int>& path, vector<int>& choice, ...) {// 满⾜结束条件if (/* 满⾜结束条件 */) {// 将路径添加到结果集中res.push_back(path);return;}// 遍历所有选择for (int i 0; i < choices.size(); i) {// 做出选择…...

在ubuntu 24.04.2 通过 Kubeadm 安装 Kubernetes v1.31.6

文章目录 1. 简介2. 准备3. 配置 containerd4. kubeadm 安装集群5. 安装网络 calico 插件 1. 简介 本指南介绍了如何在 Ubuntu 24.04.2 LTS 上安装和配置 Kubernetes 1.31.6 集群&#xff0c;包括容器运行时 containerd 的安装与配置&#xff0c;以及使用 kubeadm 进行集群初始…...

基于Python socket库构建的基于 P2P 的文件共享系统示例

基于 P2P 的文件共享系统 实现方式&#xff1a; 使用 Python 的socket库构建 P2P 网络&#xff0c;节点之间通过 TCP 或 UDP 协议进行通信。每个节点维护一个文件列表&#xff0c;并向其他节点广播自己拥有的文件信息。当一个节点需要某个文件时&#xff0c;它会向网络中的其…...

JavaScript 函数重载:灵活应对多场景的编程技巧

在 JavaScript 中&#xff0c;函数重载&#xff08;Function Overloading&#xff09;是一个常见的需求。尽管 JavaScript 本身并不支持传统意义上的函数重载&#xff08;即在同一个作用域内定义多个同名函数&#xff0c;根据参数的不同调用不同的函数&#xff09;&#xff0c;…...

通过 PromptTemplate 生成干净的 SQL 查询语句并执行SQL查询语句

问题描述 在使用 LangChain 和 Llama 模型生成 SQL 查询时&#xff0c;遇到了 sqlite3.OperationalError 错误。错误信息如下&#xff1a; OperationalError: (sqlite3.OperationalError) near "sql SELECT Name FROM MediaType LIMIT 5; ": syntax error [SQL: …...

用大白话解释缓存Redis +MongoDB是什么有什么用怎么用

Redis和MongoDB是什么&#xff1f; Redis&#xff1a;像你家的“小冰箱”&#xff0c;专门存高频使用的食物&#xff08;数据&#xff09;。它是基于内存的键值数据库&#xff0c;读写速度极快&#xff08;每秒超10万次操作&#xff09;。比如你每次打开手机App&#xff0c;用…...

计算机毕业设计SpringBoot+Vue.js汽车销售网站(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

【0010】HTML水平线标签详解

如果你觉得我的文章写的不错&#xff0c;请关注我哟&#xff0c;请点赞、评论&#xff0c;收藏此文章&#xff0c;谢谢&#xff01; 本文内容体系结构如下&#xff1a; 一、水平线标签概述 在HTML中&#xff0c;<hr>标签用于在网页上插入一条水平线&#xff0c;其主要…...

FastExcel与Reactor响应式编程深度集成技术解析

一、技术融合背景与核心价值 在2025年企业级应用开发中&#xff0c;大规模异步Excel处理与响应式系统架构的结合已成为技术刚需。FastExcel与Reactor的整合方案&#xff0c;通过以下技术协同实现突破性性能&#xff1a; 内存效率革命&#xff1a;FastExcel的流式字节操作与Re…...

Netty是如何实现零拷贝的?

大家好&#xff0c;我是锋哥。今天分享关于【Netty是如何实现零拷贝的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Netty是如何实现零拷贝的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Netty是一个高性能的Java网络应用框架&#xff0c;它…...

【大模型➕知识图谱】大模型结合医疗知识图谱:解锁智能辅助诊疗系统新范式

【大模型➕知识图谱】大模型结合医疗知识图谱:解锁智能辅助诊疗系统新范式 大模型结合医疗知识图谱:解锁智能辅助诊疗系统新范式引言一、系统架构1.1 系统架构图1.2 架构模块说明1.2.1 用户输入1.2.2 大模型(语义理解与意图识别)1.2.3 Agent(问题解析与任务分配)1.2.4 问…...

Spring Boot @Component注解介绍

Component 是 Spring 中的一个核心注解&#xff0c;用于声明一个类为 Spring 管理的组件&#xff08;Bean&#xff09;。它是一个通用的注解&#xff0c;可以用于任何层次的类&#xff08;如服务层、控制器层、持久层等&#xff09;。通过 Component 注解&#xff0c;Spring 会…...

MulFS-CAP: Multimodal Fusion-supervisedCross-modal

一种用于无注册红外-可见图像融合的单阶段框架。与传统的两阶段方法不同&#xff0c;MulFS-CAP结合了隐式注册和融合&#xff0c;简化了处理流程并增强了实用性。该方法使用共享的浅层特征编码器&#xff0c;同时进行特征对齐和图像融合。通过引入可学习的模态字典&#xff0c;…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...