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

这篇具有很好参考价值的文章主要介绍了vue长列表优化之虚拟列表实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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

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

1.实现原理

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

  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对应的数据展示在视图模型的效果

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

    这是列表视图模型

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

    这是列表

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

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

    为什么限制了展示列表项的长度(限制了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 {
      ...
    };
  },

效果:

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

节点变化

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

vue长列表优化之虚拟列表实现文章来源地址https://www.toymoban.com/news/detail-421826.html

到了这里,关于vue长列表优化之虚拟列表实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue2虚拟列表,umy-ui封装

    1、需求: 由于业务需求在页面一次性展示较多数据,不低于上千,但是每条数据涉及样式较多,数据渲染过多就会导致页面卡顿 2、满足: 大量数据加载;表格功能:列显隐、列顺序调整、固定、筛选、排序;表格调整存储本地 3、技术框架: 若依、Element UI、vue2 1、umy-ui库

    2024年02月04日
    浏览(45)
  • taro-ui-vue3 的虚拟列表组件VirtualScroll

    项目:taro3+vue3 用法: 参数 height — 列表容器高度 item-height — 列表item高度 items — 列表数据 注意点 :item-height不能直接用设计稿里面的高度xxpx,要转成rpx, 而css里面item的高度用设计稿的高度,比如设计稿宽750px, item高200px,间距20px, 列表容器高度是81vh, 如果容器需要减去其

    2024年02月16日
    浏览(28)
  • vue最强table vxe-table 虚拟滚动列表 前端导出

    最近遇到个问题。后台一次性返回2万条列表数据。 并且需求要求所有数据必须全部展示,不能做假分页(不能优化了)。 这些数据的直接来源就是CS客户端。 他们做CS客户端就是一次性加载几万条数据不分页(说这是客户的要求)。 我体验了一把CS客户端,数万条数据放在

    2024年02月12日
    浏览(38)
  • 实现原生微信小程序虚拟列表

    小程序的setData每一次调用,都会重新和旧的虚拟dom进行diff对比,如果页面列表比较大的话,不断频繁加载setData,实际上是非常消耗性能的,所以也是为了解决这个考虑,我虽然每一次都在使用setData加载数据,但是setData加载完成的数据,我并不是直接渲染,而是通过wxml中微

    2024年02月11日
    浏览(47)
  • IntersectionObserver实现小程序长列表优化

    关于 IntersectionObserver 这里以一屏数据为单位【一个分页的10条数据,最好大于视口高度】, 监听每一屏数据和视口的相交比例,即用户能不能看到它 只将可视范围的数据渲染到页面上,其余的使用空白高度占位符代替, 可视范围可扩大到当前可视范围的上下两倍到三倍,减

    2024年02月15日
    浏览(23)
  • vue列表中小图片放大实现

    方式1: 使用element-ui组件库中自带的组件直接进行放大。鼠标移动到其上时,会有单击放大的文字提示。 css部分,就是小盒子和点击之后的大盒子的css样式 方式二: 用别人已经写好的轮子,也会比自己写的更加美观,就比如说:使用 v-viewer 组件 第一步,安装 javascript npm

    2024年02月12日
    浏览(39)
  • Vue插槽实现商品列表-编辑渲染

    2024年02月11日
    浏览(42)
  • Vue--》搭配Bootstrap实现Vue的列表增删功能

    在日常开发中,我们可以用 “拿来主义” 借助Bootstarp现成的一些样式,快速生成我们想要的页面布局,避免书写大量的HTML和CSS代码,省下了许多不必要的时间。 当我们想要生成表单表格时我们可以查看Bootstrap的官方文档,来选择我们想要的样式,并根据自己的一些实际情况

    2024年02月02日
    浏览(42)
  • vue非插件实现列表无限循环滚动

    一、前言 最近刚好有个功能需要实现列表的无限循环滚动,在网上找到vue-seamless-scroll组件,使用起来很方便,也实现我需要的功能。我去查看了插件源码,实现原理还是比较有趣的,所以就参考了一下,自己手动实现个例子(有鼠标移入停止滚动,移出开始滚动功能)。 二

    2024年02月15日
    浏览(39)
  • vue实现音频audio列表循环,实现暂停播放切换

    功能界面如下 功能使用如下: 首先根据后端返回的音频地址进行渲染,其中playAudioSrc字段用来控制暂停样式还是播放样式,audio进行隐藏 vue处理逻辑如下

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包