位置: IT常识 - 正文

uniapp/vue虚拟列表,数据列表渲染优化(uniapp vuecli)

编辑:rootadmin
uniapp/vue虚拟列表,数据列表渲染优化 引言

推荐整理分享uniapp/vue虚拟列表,数据列表渲染优化(uniapp vuecli),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vuetify uniapp,uniapp 使用vuex,uniapp 虚拟列表,vue虚拟列表,vue虚拟列表,uni 虚拟列表,uni 虚拟列表,vue虚拟列表,内容如对您有帮助,希望把文章链接给更多的朋友!

相信大家经常会遇到展示一堆数据的需求,几十条数据还好,要是几百上千条,甚至带上了图片。那就会卡得不行。这时候就需要按需加载。

按需加载有懒加载和虚拟列表。

懒加载:通过JS滚动或触底触发事件来加载更多的数据,类似分页。虚拟列表:只加载可视区域的数据,通过计算长度区间反推需要加载的数据来实现假滑动。

二者异同

很明显,懒加载虽然也有优化,可是当用户疯狂下拉刷新时候最后还是会卡,虽然很难有那种场景。懒加载的好处就是,用户往回刷时候因为加载过,所以看上面的内容会比较顺滑。

而虚拟列表则是只加载可视范围的数据,需要精确计算,若不精确计算也可,但是有些数据会只显示了一部分(这个就需要个人自己优化一下计算的算法了,符合需求就可),而且因为是假滑动,所以观感有可能没有懒加载这么好。

uniapp/vue虚拟列表,数据列表渲染优化(uniapp vuecli)

两者在数据请求时,可以一次性拿完,也可分次拿取,懒加载便是下滑加载或触底时候请求新数据加到旧数据里。但虚拟列表拿的时候需要参考懒加载,因为用户也有往上滑的需求,这算法你们不想累死自己和后端吧。

接下来用Uniapp来演示,原生vue也可参考使用(更方便),理论上是一样的,区别就在于uniapp做微信小程序时候没有document可供使用(除非使用dhtml-weixin等插件),非H5端在某些组件上不能使用ref获取实例(如view),如此一来操作dom,只能通过官方提供的uni.createSelectorQuery()接口。

原理

 如图,黑框是数据列表的总高度,红框是你设定的可视范围,与动图里不同的是,红框内的数据是实时生成的(并不是通过隐藏其他数据),并且因为偏移量采用了取余操作(如果有需要可以自己定制),保证了在红框内第一条数据永远是完整展示的。只是因为滑动时未停下,js未响应前,新的列表不会生成,就会有一个假滑动的效果。

代码<template><scroll-view class="container" scroll-y="true" @scroll="scroll" ><!-- 虚拟列表总高度 --><view :style="{'height': `${totalHeight}rpx`, 'position': 'relative'}"><!-- 可视渲染区 --><view :style="{'top': `${top}px`}" style="width: 100%;position:absolute"> <!--在这里自定义你数据的展示结构和样式,itemHeight为这里的总高度--><view v-for="(item,index) in showList" :key="index" class="item"><span>我是第{{item.index}}条数据</span></view></view></view></scroll-view></template><script>export default {data(){return{allList:[],//原始数据列表//虚拟列表showList: [], //可视区域显示的数据itemHeight: 100,//每条数据所占高度showNum: 0, //可视区域显示的最大条数top: 0, //偏移量scrollTop: 0, //卷起的高度startIndex: 0, //可视区域第一条数据的索引endIndex: 0, //可视区域最后一条数据的索引+1,}},onLoad() { //获取数据列表for(let i=0;i<100;i++){this.allList.push({'index':i})}// console.log(this.allList)},onShow() { //第一次时调用一下,且uni.createSelectorQuery()需要在生命周期mounted之后使用this.scroll()},computed: {totalHeight() {return this.allList.length*this.itemHeight*2//因为rpx和px的关系}},methods:{//虚拟列表getShowList(){ //可视区域能出现的数据条数this.showNum = Math.ceil(this.contentHeight/this.itemHeight); // console.log('可视数量',this.showNum) //可视区域第一条数据的索引this.startIndex = Math.floor(this.scrollTop/this.itemHeight); // console.log('初始索引',this.startIndex) //可视区域最后一条数据的下一条数据this.endIndex = this.startIndex + this.showNum; //可视区数据,会比实际可视多渲染一条 this.showList = this.allList.slice(this.startIndex, this.endIndex) // console.log(this.showList) //保证滑动时第一条数据完整展示let offsetY = this.scrollTop - (this.scrollTop % this.itemHeight); this.top = offsetY;},scroll(){// 利用uniapp提供的接口获取可视区域的高度和滚动高度let query=uni.createSelectorQuery()let container=query.select('.container');container.fields({// rect:true, //是否返回节点布局位置信息{left,top,right,bottom}size:true, //是否返回节点尺寸信息{width,height}scrollOffset:true //是否返回节点滚动信息{scrollLeft,scrollTop}},(res)=>{console.log(res)this.scrollTop=res.scrollTopthis.contentHeight=res.heightthis.getShowList();//因为所在函数是异步}).exec()},}}</script><style>.container{width: 100%;height: 100vh; /*原生一定得有这个overflow的hidden效果,此处用了scroll-view所以不需要*//*overflow:auto;*/}.item{/* 按照实际需求写css */width: 100%;height: 200rpx;/* 要对应上itemHeight */border: 1rpx solid slateblue;}</style>注意点

1、uniapp里需要使用scroll-view才能实现隐藏滑动效果。原生的看代码里一样加上overflow:auto即可滑动,原生把所有view结构换成div。

2、uni.createSelectorQuery()的那个获取信息成功后执行的函数是异步执行的,所以需要留意一下你的同步操作,比如this.getShowList()不要放在外面。

3、可惜的是,不知道是不是v-for里的.item的问题,uni.createSelectorQuery()死活都拿不到节点,否则可以动态拿到每个数据节点的实际总高度。(注意这里不适用每条数据高度都不一样的情况,如需要高度不一样,请自行调整,如把itemHeight单独放在list的对象内之类,或通过改变现有结构统一固定每条数据的高度)

所以我这里uniapp是写死了itemHeigh,itemHeigh(px单位制)和下面css样式里的height需要对应上,你也可以看到我computed里让itemHeigh乘了2,(因为大多数设备的rpx和px的css像素比例都是2:1)其实对应不上,效果还是会有的,所以不用特别纠结代码里的rpx和px单位。只要渲染的列表数据长度大于可视区域的列表数据长度即可。

先写到这了,有想起来或者出错再补充修改,如果你有更好的建议或纠错,欢迎评论,多多点赞谢谢。

本文链接地址:https://www.jiuchutong.com/zhishi/284036.html 转载请保留说明!

上一篇:windows7安装node14版本及以上(windows7安装nodejs14)

下一篇:H5外部浏览器直接调起微信——通过url协议 weixin:// 判断是否安装微信及启动微信(支持h5浏览器)

  • 荣耀30pro支持电子书模式的吗(荣耀30pro支持充电)

    荣耀30pro支持电子书模式的吗(荣耀30pro支持充电)

  • iphone设置铃声的方法(苹果设置铃声音乐)

    iphone设置铃声的方法(苹果设置铃声音乐)

  • 苹果11相册怎么上锁(苹果11相册怎么设置密码)

    苹果11相册怎么上锁(苹果11相册怎么设置密码)

  • airpods充电一直闪橙光(airpods充电一直闪)

    airpods充电一直闪橙光(airpods充电一直闪)

  • 苹果se2外观尺寸(苹果se2外观尺寸多大)

    苹果se2外观尺寸(苹果se2外观尺寸多大)

  • 两人位置共享怎么用(两人位置共享怎么关闭)

    两人位置共享怎么用(两人位置共享怎么关闭)

  • 荣耀旗舰机有哪些(荣耀旗舰机有哪些系列2022)

    荣耀旗舰机有哪些(荣耀旗舰机有哪些系列2022)

  • 3ds数据线接口叫什么(3ds充电线和nds)

    3ds数据线接口叫什么(3ds充电线和nds)

  • 小米10pro充电发热(小米10pro充电发烫正常吗?)

    小米10pro充电发热(小米10pro充电发烫正常吗?)

  • oppofindx2屏幕大小(oppofindx2pro屏幕大小)

    oppofindx2屏幕大小(oppofindx2pro屏幕大小)

  • 怎么关闭震动(怎么关闭震动声音苹果14)

    怎么关闭震动(怎么关闭震动声音苹果14)

  • b站免流卡能随时注销么(b站免流卡可以免流游戏吗)

    b站免流卡能随时注销么(b站免流卡可以免流游戏吗)

  • 字符型常量有哪两种形式(字符型常量符号)

    字符型常量有哪两种形式(字符型常量符号)

  • ipad换行键在哪里(ipad2020怎么换行)

    ipad换行键在哪里(ipad2020怎么换行)

  • 监控设备离线是怎么回事(监控设备离线是什么意思)

    监控设备离线是怎么回事(监控设备离线是什么意思)

  • 苹果watch能录音吗(苹果watch录音如何导出)

    苹果watch能录音吗(苹果watch录音如何导出)

  • qq的绿钻有什么用(qq绿钻是什么意思)

    qq的绿钻有什么用(qq绿钻是什么意思)

  • 淘宝的会员表示在哪呢(淘宝会员的定义)

    淘宝的会员表示在哪呢(淘宝会员的定义)

  • 抖音怎么发表情包(电脑版抖音怎么发表情)

    抖音怎么发表情包(电脑版抖音怎么发表情)

  • x27 128和256区别(x27内存128和256这两个手机有什么不同)

    x27 128和256区别(x27内存128和256这两个手机有什么不同)

  • 优酷智能播放能取消吗(智能优酷app)

    优酷智能播放能取消吗(智能优酷app)

  • 如何将文本文件转换为Excel文件(如何将文本文件导入wps表格)

    如何将文本文件转换为Excel文件(如何将文本文件导入wps表格)

  • 摩拜单车如何充值(摩拜单车充电宝冲不上电)

    摩拜单车如何充值(摩拜单车充电宝冲不上电)

  • 安卓系统耗电量大怎么解决(安卓系统耗电量大)

    安卓系统耗电量大怎么解决(安卓系统耗电量大)

  • 平安树的养殖方法和注意事项(平安树的养殖方法和浇水时间)

    平安树的养殖方法和注意事项(平安树的养殖方法和浇水时间)

  • Win7下6GB内存只显示3.25GB的解决办法(win76g内存只有3g可用)

    Win7下6GB内存只显示3.25GB的解决办法(win76g内存只有3g可用)

  • phpcms要钱吗(phpcms视频教程)

    phpcms要钱吗(phpcms视频教程)

  • 缴纳房产税怎么记账
  • 对本次疫情有什么看法
  • 加工承揽属于劳务关系吗
  • 广告发布费在哪个分类
  • 国税 增值税
  • 丢失发票罚款如何入账
  • 政策性用房包括哪些
  • 生产过程中产品的质量保证体系
  • 发票添加商品编码怎么填
  • 企业少报收入
  • 公司怎么样才能给员工交社保
  • 金三打印客户端插件如何下载?
  • 对公人民币转账、汇款(含退汇)分录
  • 工会有纳税号吗
  • 兼职获得员工旅游资源
  • 换账套期初数怎么填
  • 无形资产和固定资产计提折旧的时间
  • 商票背书需要对方开发票吗
  • 专项应付款增加记哪方
  • 技术服务费怎么开票
  • 固定资产已入库款项已付次月开发票何时记提折旧
  • 利息支出怎么结转
  • linux alias永久生效
  • 净现值是否可行
  • mysql高级语句
  • mac压盘
  • 键盘灯无法开启
  • 存放中央银行款项科目按其资金性质
  • php找零
  • 公司账户转法人账户
  • chattr i
  • vuerouter模块化
  • 装饰工程公司施工一般包括哪些内容?
  • 过路费发票抵扣2023新规定
  • python rem
  • 手机超过多少钱算贵
  • 发票说明格式
  • 海关缴款书上完税价格含增值税吗
  • 买手机手续费怎么算的
  • 折旧汇总分配周期参数设定完成可以更改吗
  • 深入mysql源码
  • 未分配利润实际没有钱分配是什么原因
  • 企业注销后账务保留多久
  • 小额贷款在银行需要什么条件
  • 快递公司成本分析
  • 小规模购置金税盘抵税如何申报
  • 个体户记账报税
  • 为什么新准则要实施
  • 展厅租赁税率
  • 担保贷款中的特殊形式
  • 健全的财务会计制度承诺函
  • SQLServer Top语句参数化方法
  • MySQL中使用____关键字来删除表格中的数据
  • win7开机报错0xc0000098
  • 轻松玩转职场职场沟通与写作技巧答案
  • wp8.0升级8.1
  • window打开注册表
  • windows10x预览版
  • 虚拟机linux使用
  • Ubuntu 15.04系统怎么清理的系统垃圾文件?
  • linux没有ssh
  • WIN10系统崩溃如何自救?
  • win8.1 ie浏览器
  • http://www.2cto.com/kf/201402/280576.html
  • JS实现的base64加密解密完整实例
  • node.js使用的v8引擎是由哪个公司开发的
  • wmic命令详解
  • python输出unicode编码
  • jquery 设置背景色
  • nodejs使用场景
  • javascript判断题
  • javascript快速入门
  • js判断输入框字符长度
  • 湖北省国家税务总局
  • 专票购买方是对方公司吗
  • 江苏税务个人所得税app怎么下载不了?
  • 本市可以跨县高考报名吗
  • 用于赞助的消费品需要缴纳消费税吗
  • 怎么注册用户名短的淘宝账号
  • 上海增值税发票抵扣
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设