Vue项目中的虚拟滚动:提升页面渲染性能的最佳实践

简介: 本文介绍虚拟滚动技术及其在Vue项目中的应用,通过vue-virtual-scroller实现大数据量下长列表的高性能渲染,提升页面流畅度与用户体验,适用于地图轨迹等业务场景。

目录

前言

在现代 Web前端开发中,性能优化一直是个重要话题。尤其在数据量较大的情况下,页面的渲染性能会直接影响用户体验。使用虚拟滚动技术,可以有效解决大数据量下的渲染性能问题。本篇文章将带你深入了解虚拟滚动的应用,帮助你在Vue项目中优化页面渲染性能。

什么是虚拟滚动

虚拟滚动(Virtual Scrolling)是一种高效的渲染技术,主要用于处理大量数据的长列表或表格。其基本原理是只渲染当前视口内可见的元素,而对不可见的部分仅保留占位符。这种方法大幅减少了DOM节点的数量,从而提升了渲染性能和滚动流畅度。

虚拟滚动的核心有以下 4 点:

  • 渲染可见元素:虚拟滚动只会渲染当前视口内的元素,而不是整个列表或表格。比方说,假设视口中只能显示10个元素,那么虚拟滚动技术只会渲染这10个元素,即使总数据量有上万个。
  • 动态更新视口内容:当用户进行滚动操作 时,使用虚拟滚动技术可以动态更新可视区域内的内容。新进入视口的元素会被渲染,而离开视口的元素会被销毁,从而保持视口内元素的数量相对稳定。
  • 减少DOM操作:由于只渲染了可视区域内的元素,虚拟滚动大幅减少了DOM操作的频率。这不仅提高了渲染速度,还减小了内存占用,从而提升了整体性能。
  • 占位元素:为了确保滚动条的正确性,虚拟滚动技术通常会使用一个高度为所有元素总高度的占位元素。这种占位元素会占据整个列表的高度,从而使滚动条的行为与渲染所有元素时相同。

业务案例

我接到过一个需求,就是某个页面,需要展示多个人的地图行为轨迹,这个人数比较多,可能有上千人,由于后端限制,不能做成分页的形式,只能做成一个很长的、可以滚动的列表。如果数据少,一次性渲染也还好,数据多了,页面操作必然会有些卡顿的,这对页面性能消耗比较大。选择虚拟滚动,就能很好的解决这个问题。

实现方式

由于我这里是 Vue的项目,这里推荐一个很好用的第三方库:vue-virtual-scroller。

在 GitHub 上,可以看到针对 Vue2 或者 Vue3 的使用说明。

这里介绍下 Vue2 的使用方法:

通过 npm安装

npm install vue-virtual-scroller

main.js引入

import { RecycleScroller } from 'vue-virtual-scroller' // 虚拟滚动插件
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
Vue.component('RecycleScroller', RecycleScroller)

这里我用的是RecycleScroller,适用于列表每一项大小固定的情况。如果你的每一项的高度不固定,你可以使用DynamicScrollerDynamicScrollerItem来实现虚拟滚动。

在Vue页面中使用

template 部分

<div class="table-box">
  <RecycleScroller class="scroller" :items="pointsData" :item-size="80" key-field="name" v-slot="{ item }">
    <div class="scroller-item">
      <img src="/avatar2.jpg" alt="" />
      <div class="scroller-item-content">
        <div>{
  { item.name }}</div>
        <div>编号:{
  { item.equipmentCoding }}</div>
      </div>
      <div class="scroller-item-btn" @click="viewingTrajectories(item)">查看轨迹</div>
    </div>
  </RecycleScroller>
</div>

css 部分:

.table-box {
  display: flex;
  gap: 10px;
  height: 400px;
  .scroller {
    width: 100%;
    height: 100%;
    .scroller-item {
      display: flex;
      justify-content: space-between;
      align-items: center;
      height: 70px;
      padding: 10px 16px;
      margin-bottom: 10px;
      border-radius: 15px;
      background: linear-gradient(180deg, #dee9ff 0%, #ffffff 100%);
      box-shadow: 1px 1px 6px 0px rgba(163, 190, 244, 0.67);
      border-radius: 4px 4px 4px 4px;
      border: 1px solid #fff;
      border-image: linear-gradient(180deg, rgba(255, 255, 255, 1), rgba(255, 255, 255, 0)) 1 1;
      &:nth-last-child(1){
        margin-bottom: 0;
      }
      > img {
        width: 40px;
        height: 40px;
        border-radius: 100px;
      }
      > .scroller-item-content {
        display: flex;
        flex-direction: column;
        justify-content: flex-start;
        align-items: flex-start;
        gap: 4px;
        font-size: 14px;
        margin-left: 16px;
        > div:nth-child(1) {
          font-weight: 500;
          color: #1d2129;
        }
        > div:nth-child(n + 2) {
          font-weight: 400;
          color: #86909c;
        }
      }
      > .scroller-item-btn {
        cursor: pointer;
        user-select: none;
        margin-left: auto;
        margin-top: auto;
        padding: 5px 16px;
        border-radius: 20px;
        border: 1px solid #0a57fe;
        font-weight: 400;
        font-size: 14px;
        color: #0a57fe;
      }
    }
  }
}

这里需要注意,如果你希望让子元素之间有间距,我设置了item-size="80",同时设置.scroller-item这个class 的样式的height 为 70px,以及设置它的margin-bottom:10px;,最后一个元素设置 margin-bottom: 0

效果预览

请在此添加图片描述

可以看到,无论是鼠标滚轮,还是拖动滚动滑块,都可以有很流畅的滚动效果。

总结

通过引入虚拟滚动技术,我们可以显著提升大数据量列表的渲染性能和用户滚动体验。虚拟滚动通过只渲染可视区域的内容,减少了DOM操作和内存占用,解决了传统大数据量渲染带来的性能瓶颈问题。目前 Vue3 相关的 UI 框架,大部分组件都支持了虚拟滚动,可以直接用,但 Vue2 旧项目相关的虚拟滚动相对较少,可能部分业务场景,需要自己手动实现,比方说下拉选择框、表格等。后面我会深入研究,用虚拟滚动技术,改造现有的组件。希望这篇文章可以对你有所帮助。

目录
相关文章
|
1月前
|
JavaScript 前端开发 开发工具
前端开发必备的 VSCode 插件推荐(第三期)
本文推荐两款提升Vue开发效率的VSCode插件:vue-helper,支持代码扩选、快速跳转与变量定位;别名路径跳转插件,解决@路径无法跳转问题。配置简单,实用高效,助力前端开发提速。
299 0
|
8月前
|
前端开发 JavaScript 索引
前端性能优化:虚拟滚动技术原理与实战
前端性能优化:虚拟滚动技术原理与实战
1128 80
|
11月前
|
JavaScript 前端开发 UED
PDF在线预览实现:如何使用vue-pdf-embed实现前端PDF在线阅读
本文详细介绍了如何在Vue项目中使用vue-pdf-embed实现PDF文件的在线展示。从项目初始化、插件集成到高级功能的实现和部署优化,希望对你有所帮助。在实际项目中,灵活运用这些技术可以大大提升用户体验和项目质量。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
SQL XML JavaScript
【若依Java】15分钟玩转若依二次开发,新手小白半小时实现前后端分离项目,springboot+vue3+Element Plus+vite实现Java项目和管理后台网站功能
摘要: 本文档详细介绍了如何使用若依框架快速搭建一个基于SpringBoot和Vue3的前后端分离的Java管理后台。教程涵盖了技术点、准备工作、启动项目、自动生成代码、数据库配置、菜单管理、代码下载和导入、自定义主题样式、代码生成、启动Vue3项目、修改代码、以及对代码进行自定义和扩展,例如单表和主子表的代码生成、树形表的实现、商品列表和分类列表的改造等。整个过程详细地指导了如何从下载项目到配置数据库,再到生成Java和Vue3代码,最后实现前后端的运行和功能定制。此外,还提供了关于软件安装、环境变量配置和代码自动生成的注意事项。
30202 73
|
自然语言处理 前端开发 JavaScript
ECharts实现雷达图详解
ECharts 是百度开源的一款强大的数据可视化工具,支持多种图表类型如折线图、柱状图、饼图等,并提供丰富的交互功能。其核心实现原理包括数据驱动、Canvas/SVG渲染、响应式布局、动画效果、事件监听等。本文通过具体示例介绍了如何使用 ECharts 实现交互式雷达图,包括引入库、创建图表容器、配置雷达图、添加交互功能及动态数据更新等功能。通过简单的步骤即可在网页中展示绚丽的数据大屏。
1955 4
ECharts实现雷达图详解
|
资源调度 JavaScript 前端开发
Vue2项目使用v-viewer插件实现图片预览、切换、缩放、旋转...
这篇文章介绍了在Vue 2项目中如何通过`v-viewer`插件实现图片的预览、切换、缩放、旋转等功能,并提供了插件的安装、配置和使用方法。
4796 0
Vue2项目使用v-viewer插件实现图片预览、切换、缩放、旋转...
|
Kubernetes 架构师 Java
史上最全对照表:大厂P6/P7/P8 职业技能 薪资水平 成长路线
40岁老架构师尼恩,专注于帮助读者提升技术能力和职业发展。其读者群中,多位成员成功获得知名互联网企业的面试机会。尼恩不仅提供系统化的面试准备指导,还特别针对谈薪酬环节给予专业建议,助力求职者在与HR谈判时更加自信。此外,尼恩还分享了阿里巴巴的职级体系,作为行业内广泛认可的标准,帮助读者更好地理解各职级的要求和发展路径。通过尼恩的技术圣经系列PDF,如《尼恩Java面试宝典》等,读者可以进一步提升自身技术实力,应对职场挑战。关注“技术自由圈”公众号,获取更多资源。
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
|
前端开发 虚拟化
简单记录使用 ElementPlus 的虚拟化树形控件(el-tree-v2)心得
这篇文章分享了作者使用ElementPlus的虚拟化树形控件`el-tree-v2`的心得,展示了其基本用法和如何通过自定义模板来增强树节点的交互性。
4535 1
简单记录使用 ElementPlus 的虚拟化树形控件(el-tree-v2)心得
|
存储 Java 测试技术
阿里巴巴java开发手册
这篇文章是关于阿里巴巴Java开发手册的整理,内容包括编程规约、异常日志、单元测试、安全规约、MySQL数据库使用以及工程结构等方面的详细规范和建议,旨在帮助开发者编写更加规范、高效和安全的代码。