返回顶部
首页 > 资讯 > 精选 >怎么让vue长列表快速加载
  • 448
分享到

怎么让vue长列表快速加载

2023-06-14 08:06:01 448人浏览 八月长安
摘要

小编给大家分享一下怎么让Vue长列表快速加载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!vue-long-list-load,满足特殊条件的长列表加载。支持:1

小编给大家分享一下怎么让Vue长列表快速加载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

vue-long-list-load,满足特殊条件的长列表加载。支持:1、各个节点高度不同且可自由设定 2、各个节点可修改不影响加载效果 3、可精确的滚动到指定位置。

背景

有个长列表渲染的需求,本来用vue-virtual-scroll-list的。但是每个节点的高度不一样,用着有点问题。如果也有相应的需求可以参考下我的方案。欢迎大家交流!

vue-long-list-load

满足特殊条件的的长列表加载。 列表内各个节点高度不一,各个节点可以进行修改,定位到指定位置指定节点。 

主要内容

  1. vue-long-list-load 与 vue-virtual-scroll-list 对比

  2. vue-long-list-load实现思路

  3. 基本代码

  4. 插件使用方式

  5. 插件参数说明

一、组件对比

vue-long-list-load ,vue-virtual-scroll-list两个插件各有优缺点,当我们在选择插件的时候要选择最适合应用场景的插件。下面是两个插件的基本功能对比。vue-long-list-load 主要特点是适用于各个节点尺寸不统一的场景,vue-virtual-scroll-list更适用于高度统一节点以列表长度以w计的这种列表。

组件vue-long-list-loadvue-virtual-scroll-list
npm地址www.npmjs.com/package/vue…www.npmjs.com/package/vue…
核心先空dom占位,显示区域内组件挂载显示计算当前显示区域内要显示的组件挂载
横向支持支持
列表内高度一致支持支持
列表内高度不一致支持支持不好
滚动到指定组件支持高度不一致时计算不准确
滚动事件支持支持
组件高度改变事件支持支持
隐藏组件支持不支持

二、实现思路

主要思想就是通过\color{red}{虚拟dom}虚拟dom占位各个节点,根据可显示视口的变化来展示该展示的节点。影响可显示视口的因素的监听,页面整体宽高变化、节点高度变化、页面的滚动定位到某一个节点等都可能会影响到视口的变化。当视口发生变化后计算可显示的节点,将可显示的节点挂载上节点的组件,不在视口内的节点销毁组件紧保留一个空的div。下图为实现思路的流程图。

怎么让vue长列表快速加载

三、关键方法源码分析

主入口html结构如下,\color{red}{v-for}v−for 展示长列表长度的的节点,并且通过:style 来设置一个\color{red}{最小高度}最小高度,设置最小高度的原因是这个高度值可能不准确,当真正组件渲染完之后计算出最准确的高度,如果直接height的话可能会使节点内的组件展示不全。同时每个节点设置唯一id(scrollItem_ 唯一标识),在根据数据获取dom信息时候使用。节点组件定义了唯一的class (long-item- 唯一标识),主要用来挂载真实列表组件,同时监听组件的高度变化。showList[index]来控制节点是否时候显示的唯一标识。

  <!--html代码-->  <template>    <div       :      :      :key="item[dataKey]"      :id="'scrollItem_' + item[dataKey]"      v-for="(item,index) in dataList"       >      <long-item         v-if="showList[index]"        :dataKey="dataKey"         :item="item"        :boxHeight="item.height||0"        :direction="direction"        :heightChange="heightChange"        :extendCcomments="extendCcomments">       </long-item>    </div>  </template>

当showList[index]为true的时候,对应的节点显示。long-item 在mounted生命周期时,回调extendCcomments。通过\color{red}{Vue.extend Profile}Vue.extendProfile挂载到对应的dom上。componentProps是节点组件传过来的一些参数,在挂载的时候全部挂载上。

 <!--挂载组件-->  extendCcomments(item){    this.componentProps.item=item    var Profile = Vue.extend(this.dataComponent);        // 创建 Profile 实例,并挂载到一个元素上        new Profile({          propsData:this.componentProps        }      ).$mount('.long-item-'+item[this.dataKey]);  }

通过\color{red}{element-resize-detector}element−resize−detector来监听dom尺寸的变化,每个节点的宽高发生变化的时候,并且与原来的尺寸不一样回调heightChange方法,进行尺寸的更新及显示节点的操作计算。

 <!--每个节点尺寸发生变化-->  this.$nextTick(()=> {    this.$DomListener.listenTo(document.getElementById('long-item-'+this.item[this.dataKey]), (element)=>{      if(this.boxHeight != element[this.directionConfig.width]){        this.heightChange(this.item, element[this.directionConfig.width])      }     })  });

获取可显示的视口区域的方法,页面滚动和尺寸变化都会调用到这个方法,所以这个方法在调用的时候做防抖处理300ms内有连续调用只会执行最后一次调用,要不然会频繁计算影响性能。可显示视口区域计算方式是当前视口 及 前后两个视口总共三个视口的尺寸。这样在小的滚动范围内会有较好的体验。

  getShowLimit(startTop) {    const scrollTop = startTop || this.scrollWrap[this.directionConfig.scrollTo] || 0; // 滚动距离    this.viewClientHeight = this.scrollWrap[this.directionConfig.width]; // 可视区域高度    this.scrollTop = scrollTop    this.showStart = scrollTop - this.viewClientHeight    this.showEnd = scrollTop + 2*this.viewClientHeight    if(this.setTopTimer){      clearTimeout(this.setTopTimer)    }     this.setTopTimer = setTimeout(() => {      this.setItemTopheight()    }, 300);  },

根据高度或者宽度来计算节点是否显示,因为这个计算量比较大避免而且这个方法与其他方法没有什么关联,直接单独开一个\color{red}{独立线程}独立线程进行计算。通过引入\color{red}{simple-WEB-worker}simple−web−worker这个插件单独开一个线程进行计算显示节点。计算方法主要有三点:当前节点的开头在显示视口内、当前节点的结尾在显示视口内、当前节点开头和结尾都不在显示视口内。分为这三种情况,只要满足一种情况,则该节点就显示在显示视口中。

  // 根据高度计算节点是否显示  setItemTopheight(){    let stsartId = this.dataList[0]&&this.dataList[0][this.dataKey]    let startDom = stsartId && document.getElementById('scrollItem_'+stsartId)    let startTop = startDom ? startDom[this.directionConfig.offset] : 0    this.worker = this.$worker.run((dataList,showStart,showEnd, startTop,hideIds,dataKey,height) =>{      let topHeight = startTop; // 题目顶部距离顶部距离      let bottomHeight = 0; // 题目底部距离顶部距离      let showList = []      for(let i=0,len=dataList.length;i<len;i++){        let item = dataList[i]        if(hideIds.indexOf(item[dataKey]) != -1){          showList[i] = false;          continue;        }        bottomHeight = topHeight + (item.height>=0?item.height:height)        // 判断 1.题目顶部在显示范围内 2.题目底部在显示范围内 3.题目顶部和底部都不在显示范围内         if((topHeight>=showStart && topHeight<=showEnd)||          (bottomHeight>=showStart && bottomHeight<=showEnd)||          (topHeight<showStart && bottomHeight>showEnd) ){          showList[i] = true}         else{          showList[i] = false        }         topHeight += ((item.height>=0?item.height:height));      }      return showList    }, [this.dataList, this.showStart, this.showEnd, startTop, this.hideIds,this.dataKey,this.height])    .then(res => {      this.showList = res    })    this.worker = null  },

四、使用方式

安装vue-long-list-load:

npm install vue-long-list-load --save

项目内调用

<long-list  ref="vueLongList" dataKey='id'  scrollWrap :dataList="dataList"  :dataComponent="dataComponent"  :componentProps="componentProps" height=100 > </long-list>

五、参数说明

参数说明类型必填可选值默认值
scrollWrapid列表滚动容器idstringtrue
dataKey节点数据内唯一键值Stringtrue
dataList列表数据Arraytrue具体见下方说明
dataComponent自定义的节点组件true
ref调用组件内部方法stringfalse
direction滚动方向Numberfalse0:纵向,1横向0
hideIds列表中需要隐藏的节点Arrayfalse具体见下方说明[]
height节点高度Numberfalse100
componentProps节点组件要传递的参数Objectfalse{}
scroll滚动区域内滚动回调方法Functionfalse-
resized某个节点宽高发生变化回调方法Functionfalse具体见下方说明

部分参数说明

  &lt;--假设 dataKey=id-->    &lt;--列表中需要隐藏的节点-->  hideIds:[1, 2]  &lt;--列表数据 dataList 内 height 为 **Number**。-->  dataList:[    {id:1,height:100},    {id:2,height:200},    {id:3,height:300},    {id:4,height:300},    {id:5,height:300}  ]    &lt;--节点高度-->  height:100  &lt;--如果dataList的数据内有height值 不需要设置这个height-->  &lt;--如果dataList 和 height 都不传递的话,默认为100 可能滚动略有卡顿;-->  &lt;--建议在每个高度都不相同的时候通过dataList传递,都相同时候通过height传递-->    &lt;--某个节点宽高发生变化回调方法 返回参数为id 与高度-->  resized(id, height){ }

以上是“怎么让vue长列表快速加载”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 怎么让vue长列表快速加载

本文链接: https://lsjlt.com/news/269250.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么让vue长列表快速加载
    小编给大家分享一下怎么让vue长列表快速加载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!vue-long-list-load,满足特殊条件的长列表加载。支持:1...
    99+
    2023-06-14
  • 如何让vue长列表快速加载
    目录背景主要内容一、组件对比二、实现思路三、关键方法源码分析四、使用方式五、参数说明总结 vue-long-list-load,满足特殊条件的长列表加载。支持:1、各个节点高度不同且...
    99+
    2024-04-02
  • VUE懒加载实战教程:让你快速掌握图片懒加载技术
    VUE懒加载原理 VUE懒加载的原理是:在页面加载时,只加载当前视窗内的图片,其他图片等到滚动到视窗内时再加载。这样可以有效减少页面加载的资源开销,提高网站的加载速度。 VUE懒加载实现方法 VUE懒加载可以使用以下两种方法实现: 1....
    99+
    2024-02-13
    VUE 懒加载 图片加载 图片优化
  • 怎么加快HTML页面的加载速度
    今天小编给大家分享一下怎么加快HTML页面的加载速度的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2024-04-02
  • 怎么让win7系统开机速度加快
    以下是一些方法可以帮助加快Windows 7系统的开机速度:1. 清理启动项:打开任务管理器(按下Ctrl + Shift + Es...
    99+
    2023-09-04
    win7
  • vue长列表数据刷新怎么实现
    本篇内容介绍了“vue长列表数据刷新怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、效果展示两列均为局部可视范围内数据刷新二、代码...
    99+
    2023-07-05
  • 怎么加速Python列表和字典
    本篇内容主要讲解“怎么加速Python列表和字典”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么加速Python列表和字典”吧!我们先编写一个装饰器函数来计算函数的执行时间,方便测验不同代码的...
    99+
    2023-06-16
  • Vue如何使用cdn加载资源加快打包速度
    目录为什么使用CDN解决方法使用CDN主要解决两个问题具体步骤资源引入打包对比附:vue项目常用的cdn地址总结为什么使用CDN Vue项目打包的时候,默认会把所有代码合并生产新文件...
    99+
    2024-04-02
  • 解锁Vue和Vant的威力:加快页面加载速度
    使用 v-model 代替双向绑定,仅在必要时更新视图。 考虑使用单向数据流,例如 Vuex,以减少不必要的重新渲染。 避免不必要的计算 使用 computed 属性缓存计算值,以防止在每次更新时重新计算。 延迟计算,例如使用 se...
    99+
    2024-04-02
  • PHP实现数据分页,让网站加载速度更快
    PHP实现数据分页,让网站加载速度更快,需要具体代码示例 随着互联网的快速发展和用户需求的不断增加,网站的数据量通常都会变得非常大,大量数据的加载会导致网页加载速度变慢,影响用户体验。...
    99+
    2024-02-29
    php 数据分页 加速加载
  • HTML5如何进行预加载让页面得以快速呈现
    这篇文章主要讲解了“HTML5如何进行预加载让页面得以快速呈现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HTML5如何进行预加载让页面得以快速呈现”吧!...
    99+
    2024-04-02
  • pycharm加载包列表出错怎么解决
    当PyCharm加载包列表出错时,可以尝试以下解决方法:1. 检查Python环境:确保PyCharm使用的是正确的Python解释...
    99+
    2023-09-27
    pycharm
  • 原生React怎么实现懒加载列表
    这篇文章主要介绍了原生React怎么实现懒加载列表的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇原生React怎么实现懒加载列表文章都会有所收获,下面我们一起来看看吧。应用场景懒加载列表或叫做无限滚动列表,也是...
    99+
    2023-07-05
  • Python怎么让列表逆序排列
    这篇文章主要介绍“Python怎么让列表逆序排列”,在日常操作中,相信很多人在Python怎么让列表逆序排列问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python怎么让列表逆序排列”的疑惑有所帮助!接下来...
    99+
    2023-06-30
  • vue怎么让输入框变长一点
    这篇文章主要介绍“vue怎么让输入框变长一点”,在日常操作中,相信很多人在vue怎么让输入框变长一点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue怎么让输入框变长一点”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-06
  • 怎么在Android中加载长图
    本篇文章为大家展示了怎么在Android中加载长图,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动...
    99+
    2023-06-14
  • 香港服务器怎样加快网站加载速度
    香港服务器加快网站加载速度的方法有:1、选择能够直接连接国内网络骨干的香港服务器机房;2、选择域名解析速度快的香港域名服务器;3、尽量减少香港服务器部署网站的页面请求数量;4、对香港服务器的网站进行网页结构代码优化以及压缩图片大小;5、选择...
    99+
    2024-04-02
  • 怎么使用css快速创建3点加载动画
    这篇文章主要介绍了怎么使用css快速创建3点加载动画,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。直接上代码:<!DOCTYPE&nb...
    99+
    2024-04-02
  • vue项目中怎么优化首页加载速度
    本篇文章为大家展示了vue项目中怎么优化首页加载速度,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1: 针对第三方js库的优化我们项目里用到的第三方js库主要有:v...
    99+
    2024-04-02
  • python怎么快速做表格
    使用 python 快速创建表格的方法主要有两种:使用 pandas 库的 dataframe 对象组织数据并转换为表格格式。使用 tabulate 库的 tabulate() 函数将数...
    99+
    2024-05-14
    python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作