vue大数据量列表渲染性能优化:虚拟滚动原理

news2025/1/15 6:40:08

前面咱完成了自定义JuanTree组件各种功能的实现。在数据量很大的情况下,我们讲了两种实现方式来提高渲染性能:前端分页和节点数据懒加载。

前端分页小节:Vue3扁平化Tree组件的前端分页实现

节点数据懒加载小节:Element Tree Plus版功能演示:数据懒加载

关于扁平化结构Tree和嵌套结构Tree组件的渲染

嵌套结构的Tree组件是一种递归渲染,性能上比起列表结构的v-for渲染比较一般。对于这种渲染方式,在数据量很大的情况下,只有通过懒加载可以提高渲染性能;而扁平化结构则有更多的选择,前端分页是一种方式,还有一种更好的选择,就是本节介绍的虚拟滚动。

在这里插入图片描述

下一小节,我们将对自定义JuanTree组件来应用虚拟滚动,解决数据量非常大的情况下的用户体验良好的高性能渲染。本小节讲原理和基本demo的实现,喜欢的点个赞,关注下,后续会更精彩!

功能演示

在这里插入图片描述

虚拟滚动的原理

在这里插入图片描述

demo实现

编写vitepress示例

在这里插入图片描述

滚动条的实现

考虑到原生滚动条太丑,我们使用element-plus提供的el-scrollbar组件,因为它简单好用且展示也很美观。

element plus在基于vite的vue3 tsx项目的整合请参考:vite tsx项目的element plus集成 - 按需引入踩坑

demo示例源码

src/components/VirtualList.vue

实现非常简单易懂!

<script setup lang="ts">
import { computed, ref } from 'vue'

const containerHeight = 24 * 12 // 容器高度
const itemHeight = 24 // 列表项高度
const visibleCount = Math.ceil(containerHeight / itemHeight) // 可视区域列表元素数量
const totalCount = 1000 // 列表元素总数
const data = ref(Array.from({ length: totalCount }).map((_, index) => ({ value: index })))
// 起始索引
const startIndex = ref(0)
// 可视区域的数据
const visibleData = computed(() => data.value.slice(startIndex.value, startIndex.value + visibleCount))
// 数据列表在Y轴的偏移量
const offsetY = ref(0)
const onScroll = (event: any) => {
  const scrollTop = event.scrollTop
  // 按照滚动的高度触发可视区域数据计算属性的重新计算。
  startIndex.value = Math.floor(scrollTop / itemHeight)
  // 同步更新数据列表元素translate3d样式y轴的偏移量,确保其始终与视口的最上端对齐
  offsetY.value = scrollTop
}
</script>

<template>
  <el-scrollbar class="vl-container" :height="containerHeight" @scroll="onScroll">
    <div class="vl-wrapper">
      <!--  展示滚动条  -->
      <div
        class="vl-blank"
        :style="{
          height: `${totalCount * itemHeight}px`
        }"
      ></div>
      <!--  数据列表 -->
      <div
        class="vl-data"
        :style="{
          transform: `translate3d(0, ${offsetY}px, 0)`
        }"
      >
        <div class="item" v-for="(item, index) in visibleData" :key="index">Item {{ item.value }}</div>
      </div>
    </div>
  </el-scrollbar>
</template>

<style scoped lang="scss">
.vl-wrapper {
  position: relative;

  .vl-blank {
    position: absolute;
    top: 0;
    right: 0;
    left: 0;
  }
}
</style>

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

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

相关文章

镜像制作和管理

文章目录 一、Docker镜像说明Docker镜像中没有内核为什么没有内核容器中的程序后台运行会导致此容器启动后立即退出镜像的生命周期和制作方式 二、手动构建镜像基于容器手动制作镜像步骤实际操作基于 busybox 制作httpd镜像制作tomcat镜像基于ubuntu的基础镜像手动安装nginx镜像…

空间域注意力机制(Spatial Attention)

空间域注意力机制&#xff08;Spatial Attention&#xff09;是深度学习中一种重要的注意力机制&#xff0c;用于在处理如图像或视频数据时聚焦于特定区域&#xff0c;以提高模型的性能和效率。举例来说&#xff0c;首先&#xff0c;卷积神经网络处理一张图像&#xff0c;经过特…

【Docker】认识 Docker(版本、官方网站、架构、生态)

一、Docker 版本 Docker 发展过程中衍生了以下版本&#xff0c;目前我学习和使用提到的版本是 docker-ce。 1、lxc lxc 是最早的 linux 容器技术&#xff0c;早期版本的 docker 直接使用 lxc 来实现容器的底层功能。虽然使用者相对较少&#xff0c;但 lxc 项目仍在持续开发演…

理想发周榜,不是新能源市场的原罪

余华在他的小说《在细雨中呼喊》曾写过这么一段话&#xff1a; “仓廪实而知礼节&#xff0c;衣食足而知荣辱”&#xff0c;在物质需求得到满足以前&#xff0c;精神文明的发展难免会有所滞后。所以&#xff0c;贫穷&#xff0c;不是原罪。 同样的&#xff0c;在如今的新能源…

常见API(一)

API(Application Programming interface):应用程序编程接口&#xff0c;别人写好的程序&#xff0c;直接拿来调用。主要是为了灵活解决需求。这次只先简单学习了一下String和ArrayList两个。 1.包 包是分门别类管理程序的&#xff0c;类似于文件夹。别人写好的包通常都在别人的…

Android Studio2024安装教程

软件介绍 Android Studio 是谷歌推出的一个Android集成开发工具。 基于IntelliJ IDEA. 类似 Eclipse ADT&#xff0c;Android Studio 提供了集成的 Android 开发工具用于开发和调试。 软件下载 https://docs.qq.com/doc/DR0hWZ0l4aGtVTmVr软件安装 1、双击运行安装文件 2、…

双模幂运算Java

题目&#xff1a; 给你一个下标从 0 开始的二维数组 variables &#xff0c;其中 variables[i] [ai, bi, ci, mi]&#xff0c;以及一个整数 target 。 如果满足以下公式&#xff0c;则下标 i 是 好下标&#xff1a; 返回一个由 好下标 组成的数组&#xff0c;顺序不限 。 …

RK3568平台(触摸篇)双屏异触调试

一.现象 现象&#xff1a;准备两块主屏都接触摸框&#xff0c;A屏的HDMIOUT外接B屏的HDMIIN&#xff0c;用手触摸A屏&#xff0c;发现A屏没有触摸&#xff0c;A屏幕的触摸现象在B屏那边。 现要求&#xff1a;用手触摸A屏&#xff0c;A屏要有现象&#xff0c;不能现象在B屏那边…

《Transformer Scale Gate for Semantic Segmentation》CVPR2023

摘要 论文提出了一种名为Transformer Scale Gate&#xff08;TSG&#xff09;的模块&#xff0c;用于优化在语义分割任务中多尺度上下文信息的编码。现有的基于Transformer的分割模型在组合不同尺度的特征时没有进行选择&#xff0c;这可能导致次优尺度的特征降低分割的准确性…

【网络】UDP协议——传输层、端口号、UDP协议、UDP协议端格式、UDP的特点、UDP的缓冲区、UDP使用注意事项

文章目录 Linux网络1. 传输层1.1 端口号1.2 UDP协议1.2.1 UDP协议端格式1.2.2 UDP的特点1.2.3 UDP的缓冲区1.2.3 UDP使用注意事项1.2.5 基于UDP的应用层协议 Linux网络 1. 传输层 传输层&#xff1a;是 OSI 模型和 TCP/IP 模型中的重要层次&#xff0c;位于网络层之上、应用层…

推荐一个gpt镜像网站

包含现在主流的大语言模型 一个网站&#xff0c;各种模型随意切换和体验 集成多种功能 不止于对话&#xff0c;更有文生图&#xff0c;思维导图等多种功能 支持多个平台 除了网页版&#xff0c;更有安卓, mac os, ipad os等多个平台&#xff0c;随时随地方便同步和使用 …

【大模型】【智能体】agent导论

基本的图像 react&#xff1a; prompt&#xff1a;

营收保持增长,汽车之家掌握了什么“流量密码”?

从汽车之家新鲜出炉的“成绩单”来看&#xff0c;汽车行业的流量生意依然红火。 财报显示&#xff0c;2024年第二季度&#xff0c;汽车之家实现总营收18.7亿元&#xff0c;同比增长2.2%&#xff1b;经调整净利润5.72亿元&#xff0c;经调整净利润率达30.6%。其中&#xff0c;在…

MySQL:管理和操作数据表

数据表是数据库的重要组成部分&#xff0c;每一个数据库都是由若干个数据表组成的。没有数据表就无法在数据库中存放数据。MySQL数据表的管理和操作是数据库管理员和开发人员日常工作中不可或缺的一部分。 创建数据表 CREATE 创建数据表的过程是规定数据列的属性的过程&#…

数字图像处理 --- 图像的离散余弦变换(python实战)

图像的离散余弦变换(python实战) 这篇文章是我上两篇文章的延续&#xff0c;主要是觉得前面的文章太长了&#xff0c;所以把关于图像的DCT变换部分单独拎出来放到这里&#xff0c;这两篇文章分别是&#xff1a; 1&#xff0c;一维DCT 数字信号处理 --- 一维离散余弦变换(pyth…

搜维尔科技:【研究】Haption的自动识别技术

Real-Time Interaction for Delmia Human RTID Human “Real-Time Interaction for Delmia Human” 是个附加在Delmia V5™上的软件&#xff0c;它能让使用者使用数字人体模型在虚拟环境中进行实时互动仿真 在Delmia 中使用RTI &#xff0c;使用者可以模拟进行以下研究: 1. 可…

table car vs. table cars:数据库命名用单数还是复数?

数据库的命名方式已经形成了许多共识&#xff0c;比如全部小写、下划线分隔、使用标准缩写等&#xff1b;其中就包括「使用单数名词」。 用户 jonr 在 reddit 网的程序员笑话&#xff08;ProgrammerHumor&#xff09;社区发了一篇帖子&#xff0c;调侃这些数据库命名方式的共识…

突破csdn每日15篇文章限制的方法

买一个vip年会员248元&#xff0c;就可以了.......

Linux-3:Shell编程——基础语法(0-50%)

目录 前言 一、变量 1.定义变量 2.使用变量 3.修改变量 4.将命令的结果赋值给变量 5.只读变量 6.删除变量 二、传递参数 三、字符串 1.字符串举例 2.统计字符串长度 3.字符串拼接 4.截取字符串 总结 前言 Shell是一种程序设计语言。作为命令语言&#xff0c;它…

算法学习day26

滑动窗口系列题 一、替换后的最长重复子串 给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符&#xff0c;并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。 在执行上述操作后&#xff0c;返回 包含相同字母的最长子字符串的长度。 输入&#xff1a…