vue长列表优化之虚拟列表实现

news2025/7/13 11:35:18

vue长列表优化之虚拟列表实现

应用场景:后台一次性发送上千条或更多数据给前台

场景模拟:用户发起一个请求,后台发送了10w条数据

使用虚拟列表之前:前台需要生成10w个dom节点用来渲染页面

使用虚拟列表之后:前台只需要生成少量dom节点(dom节点数量取决于前端视图需要展示的数量),就可以实现对这10w条数据的视图渲染

总之:虚拟列表就是固定dom节点数量,通过修改dom节点的内容而达到不重新增加(或删除)dom节点来实现列表的更新

1.实现原理

img

  1. 监听页面滚动,获取滚动的高度scrolltop
  2. 根据scrolltop,可以知道当前应该展示哪一段数据(即获取要展示数据的index)
  3. 根据当前展示的数据在长列表中的index,对列表进行偏移

实现思路是这样的:

  1. 设置列表初始值

    1. 需要展示给用户的数量showNum
    2. 列表item的高度itemHeight
    3. 需要展示的第一条数据的下标start
    4. 需要展示的最后一条数据的下标end
    5. 通过start和end已经showNum,我们可以得到需要展示的列表项showList,我们可以通过vue的计算属性来实时获取新的showList
  2. 建立列表视图模型

    1. 给列表视图设置高度ListWrapHeight
    2. 根据itemHeightshowNum,我们可以得到列表总高度ListHeight,我们必须要使得ListHeight高度大于ListWrapHeight,这样才能实现滚动
  3. 监听页面滚动

    1. 给列表视图模型设置监听函数,每当列表视图发生滚动,就执行回调,获取滚动高度scrolltop
    2. 通过scrolltopitemHeight我们可以得到新的start以及end,从而获取到新的showList
    3. 通过start和itemHeight我们可以给list设置偏移(translate),从而达到让start对应的数据展示在视图模型的效果

    注意:列表视图模型和列表并不是一个东西,视图模型表示者页面供列表展示的一块区域,而列表表示的是需要展示的列表项总高度

    这是列表视图模型

    image-20220530183845436

    这是列表

    image-20220530183906181

    列表中超出视图模型的节点就被隐藏了

    为什么限制了展示列表项的长度(限制了dom数量),视图模型还能持续滚动?

    给列表设置translate会增大列表的高度,既然list的高度变大了,那么视图模型就可以继续滚动

​ 实现代码

​ 以vue3为例(不管是vue2或是vue3,实现虚拟列表的核心代码都是相同的,即监听滚动,赋新值)

<div ref="listWrap" class="list-wrap" @scroll="scrollListener">

    <div class="list" ref="List">
		
        <slot  v-for="item in showList" :songInfo="item" :key="item.id"></slot>
        
    </div>
    
    
  </div>
  setup(props) {
    const list = ref(props.list); //长列表数据
    const itemHeight = ref(props.itemHeight); //item高度
    const showNum = ref(props.showNum); //展示的数据
    const start = ref(props.start); //滚动过程中的开始索引
    const end = ref(props.end); //滚动过程中的结束索引

    const listWrap = ref(null); //获取列表视图模型节点
    const List = ref(null)//获取列表节点

    onMounted(() => {

        
        listWrap.value.style.height = itemHeight.value * showNum.value + "px";//设置列表视图模型的高度

       
    });



    const showList = computed(() => {
      //获取展示的列表
      return list.value.slice(start.value, end.value);
    });

    const scrollListener = (() => {
           //获取滚动高度
            let scrollTop = listWrap.value.scrollTop;

            
            //开始的数组索引
            start.value = Math.floor(scrollTop / itemHeight.value);
            //结束索引
            end.value = start.value + showNum.value;

            
         
            List.value.style.transform =  `translateY(${start.value * itemHeight.value}px)`//对列表项进行偏移



    })

    return {
      ...
    };
  },

效果:

GIF 2022-5-30 18-45-24

节点变化

可以看到不论列表如何变化,列表dom的数量并没有新增

GIF 2022-5-30 18-47-14

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

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

相关文章

html中常见标签及其用法归纳大全

html零基础必看——htmlHTML常见标签大全 第二章&#xff1a;html常见标签前言一、常见标签&#xff08;一&#xff09;1、body标签2、div盒子标签3、p文本段落标签4、h1~h6 标题标签5、b标签和strong标签&#xff08;文字加粗标签&#xff09;6、span文字包裹标签7、br换行标签…

大二学生web期末大作业 在线电影网站 HTML+CSS+JS

&#x1f329;️ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套…

ES6展开运算符“...”

● ES6新增了一个运算符“...”&#xff0c;叫做展开运算符 ● 作用是把数组或者对象内容展开 &#xff08;1&#xff09;展开数组&#xff1a; ○ ES5方法&#xff1a;concat&#xff08;&#xff09; <script>let a [1,2,3]let b [4,5,6]//ES5的方法&#xff1a;c…

【百度地图】百度地图的使用方法 和 在vue中如何使用百度地图(超详细)

【百度地图】百度地图的使用方法 和 在vue中如何使用百度地图&#xff08;超详细&#xff09; 1- 介绍 百度地图功能强大&#xff0c;本篇文章只是对百度地图JavaScript API 进行一个介绍~ 官方网址 百度地图开放平台LBS&#xff1a;LocationBusinessServer 基于定义位置的商…

JS 连接MQTT的方法(mqtt.js的使用方法)

本文章是介绍 mqtt.js 的使用方法 一、说明 本文章使用的版本是 4.1.x &#xff0c;没用最新版的原因是 4.2.x 以上版本会报错&#xff0c;具体报错可以看我的另一篇文章&#xff0c;点击查看。使用的 4.1.x 版本地址&#xff1a;https://cdn.bootcdn.net/ajax/libs/mqtt/4.1…

若依 vue前端 动态设置路由path不同参数 在页面容器里打开新页面(新路由),面包屑和标签页标题根据参数动态改变,面包屑多级标题,侧边栏对应菜单亮起

前言 因为是在vue源码的基础上进行修改&#xff0c;所以&#xff0c;就没有复制代码在文章上&#xff0c;采取的是截图对比源码和我修改的代码片段。要麻烦你们自己手敲了。 先来看看效果&#xff1a; 场景&#xff1a;在费用配置列表中&#xff0c;点击每一项的配置&#x…

vue如何设置元素的显示隐藏

方法&#xff1a;可以使用v-if&#xff0c;也可以使用v-show指令。 v-if 指令&#xff0c;通过动态的向DOM树内添加或者删除DOM元素的方式来显示或隐藏元素&#xff1b; v-show 指令&#xff0c;通过设置DOM元素的display样式属性来控制显隐。 区别&#xff1a; v-if 会直接删除…

手把手教你在 Vue3 中自定义指令

TienChin 项目前端是 Vue3&#xff0c;前端有这样的一个需求&#xff1a;有一些前端页面上的按钮要根据用户的权限来决定是否展示出来&#xff0c;如果用户具备相应的权限&#xff0c;那么就展示对应的按钮&#xff1b;如果用户不具备对应的权限&#xff0c;那么按钮就隐藏起来…

微信小程序:用户微信登录流程(附:流程图+源码)

目录 前言 一、微信小程序是什么&#xff1f; 二、业务流程 1、使用微信小程序登录的wx.login()方法 2、后端使用登录凭证换取session_key和openid 3、前端处理session_key、openid和token 尾言 前言 随着微信小程序大规模的铺开和宣传&#xff0c;在生活中随处可见微信小程序…

vue2常见面试题

文章目录1、vue 修改数据页面不重新渲染数组/对象的响应式 &#xff0c;vue 里面是怎么处理的&#xff1f;2、生命周期Vue 生命周期都有哪些&#xff1f;父子组件生命周期执行顺序3、watch 和 computed 的区别4、组件通信&#xff08;组件间传值&#xff09;5、$nextTick6、修饰…

【微信小程序】自定义组件(二)

&#x1f381;写在前面&#xff1a; 观众老爷们好呀&#xff0c;这里是前端小刘不怕牛牛频道&#xff0c;小程序系列文章又更新了呀。 上文我们讲解了微信小程序自定义组件的入门知识&#xff0c;那么今天牛牛就来讲讲自定义组件的进阶知识吧&#xff0c;赶紧拿起小本本做笔记…

vue中三种for循环(含案例分析)

这里写目录标题三种for循环1.普通的for循环2.for in 循环3.for of 循环总结三种for循环 vue中的for循环有三种 :1.普通的for循环 ,2.for in 循环 ,3.for of 循环 它们三个各自有各自的特点和作用&#xff0c;下面我会用一个小案例来帮助大家理解它们三个的区别 &#xff08;三…

【宜搭】低代码开发师高级认证实操题1难点指导

难度&#xff1a; 较难 知识点&#xff1a; 远程数据源 表单创建 表格组件使用 js增删改查功能代码编写 在本文中&#xff0c;我将根据题目的每一点要求&#xff0c;对于我在实操过程中遇到的难点进行比较详细的介绍&#xff0c;供大家参考&#xff0c;希望能够对大家有所帮助…

Bootstrap从入门到精通(全)

目录前言1. 下载安装2. 布局容器和栅格网格系统2.1 布局容器2.2 栅格网格系统3. 常用样式4. 表单4.1 控件4.2 布局5. 插件5.1 导航框5.2 下拉菜单前言 在了解这篇文章的时候 需要提前知道这些知识点 可看我之前的文章 html从入门到精通&#xff08;全&#xff09;css属性从入…

CSS6大种选择器(超详细!!!!!!)

文章目录一、常用的css基本选择器(4种)1、标签选择器2、类选择器3.id选择器区别&#xff1a;4、通配符选择器二、复合选择器 (2种)1、交集选择器2、并集选择器三、属性选择器(5种)四、关系选择器(4种)五、伪类选择器1、元素选择伪类选择器2、否定伪类选择器3、特殊应用的伪类六…

基于Java+SpringBoot+vue+elementui图书商城系统设计实现

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取联系&#x1f345;精彩专栏推荐订阅&#x1f447;&#x1f…

完美解决el-cascader回显失败问题

项目场景&#xff1a; 项目场景&#xff1a;接手了一些老项目&#xff0c;需要做一些日志相关的操作&#xff0c;从后台日志跳转到相应页面要带上原来的请求参数&#xff0c;涉及到一个回显问题 问题描述 Element-UI的 <el-cascader /> 这个组件&#xff0c;赋值之后它…

前端与后端传递数据 — — JSON

前端与后端传递数据 — — JSON 1 前端传送JSON数据给后端 1.1 application/x-www-form-urlencoded默认格式 1.1.1 通过HttpServletRequest获取数据 /*** 通过request获取数据* param request* return*/PostMapping("/testDefaultWithNoAnno1")public String test…

自主Web服务器Http_Server

目录自主web服务器背景目标描述技术特点项目定位项目实现过程创建HttpServer基础框架TcpServer.hppHttpServer.hppLog.hppProtocol.hpp解析C端发来的HTTP报文MSG_PEEK标志位Util.hpp构建请求与响应类读取,解析请求构建响应读取请求解析请求构建响应stat系统函数发送响应sendfil…

使用uni-app开发App简易教程

使用uni-app开发App简易教程前言app端开发步骤1、 申请uniapp开发者账号2、登录后开始新建应用3、下载安装 HBuildder X 。4、新建项目5、开启webview&#xff0c;在pages-index里面写一点点代码6、配置mainifest.json7、打包h5工程配置在html中引入uniapp-sdk解决后退问题上架…