位置: 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浏览器)

  • 美团订单怎么取消订单(美团订单怎么取消退款申请)

    美团订单怎么取消订单(美团订单怎么取消退款申请)

  • 荣耀30青春版一共几种颜色呢(荣耀30青春版一直卡在开机界面)

    荣耀30青春版一共几种颜色呢(荣耀30青春版一直卡在开机界面)

  • iphone12的录屏功能怎么使用(iphone12的录屏功能在哪里设置)

    iphone12的录屏功能怎么使用(iphone12的录屏功能在哪里设置)

  • 小米8有拍照美颜吗(小米8拍照好看)

    小米8有拍照美颜吗(小米8拍照好看)

  • 一个人可以加几个企业微信(一个人可以加几个抖音粉丝团)

    一个人可以加几个企业微信(一个人可以加几个抖音粉丝团)

  • 抖音突然不给流量了(抖音不给流量是什么原因)

    抖音突然不给流量了(抖音不给流量是什么原因)

  • 分节符怎么显示出来(macword分节符怎么显示)

    分节符怎么显示出来(macword分节符怎么显示)

  • 钉钉视频会议屏幕共享视频没有声音(钉钉视频会议屏幕共享后显示学生头像)

    钉钉视频会议屏幕共享视频没有声音(钉钉视频会议屏幕共享后显示学生头像)

  • 华为p40有定位功能吗(华为p40定位功能在哪里)

    华为p40有定位功能吗(华为p40定位功能在哪里)

  • 为什么苹果手机微信来了没有提示(为什么苹果手机连不上wifi)

    为什么苹果手机微信来了没有提示(为什么苹果手机连不上wifi)

  • 小米电脑待机后怎么唤醒(小米电脑待机后黑屏无法唤醒怎么办)

    小米电脑待机后怎么唤醒(小米电脑待机后黑屏无法唤醒怎么办)

  • qq情侣黄钻一个人开另一个也有吗(qq情侣黄钻一个人开了,对方不开黄钻会消失吗?)

    qq情侣黄钻一个人开另一个也有吗(qq情侣黄钻一个人开了,对方不开黄钻会消失吗?)

  • vue添加字幕方法介绍(vue怎么添加滚动字幕)

    vue添加字幕方法介绍(vue怎么添加滚动字幕)

  • 苹果11promax怎么显示电量(苹果11promax怎么样 优点和缺点)

    苹果11promax怎么显示电量(苹果11promax怎么样 优点和缺点)

  • win10卡在正在撤销更改(windows正在撤销)

    win10卡在正在撤销更改(windows正在撤销)

  • 天猫和淘宝是一家吗(天猫和淘宝是一个账号吗)

    天猫和淘宝是一家吗(天猫和淘宝是一个账号吗)

  • procreate怎么合并图层(procreate怎么合并两个作品)

    procreate怎么合并图层(procreate怎么合并两个作品)

  • ipad有nfc的功能吗(ipad带nfc功能吗)

    ipad有nfc的功能吗(ipad带nfc功能吗)

  • 小米智能运动手环怎么使用(小米智能运动手环怎么绑定手机)

    小米智能运动手环怎么使用(小米智能运动手环怎么绑定手机)

  • 手机声卡怎么调(手机声卡怎么调搏击效果)

    手机声卡怎么调(手机声卡怎么调搏击效果)

  • 华为p30pro隐藏呼吸灯(华为p30通话界面隐藏)

    华为p30pro隐藏呼吸灯(华为p30通话界面隐藏)

  • 板载内存怎么加内存条(板载内存怎么加宏)

    板载内存怎么加内存条(板载内存怎么加宏)

  • 王者荣耀电脑版怎么设置键位?(王者荣耀电脑版叫啥名字)

    王者荣耀电脑版怎么设置键位?(王者荣耀电脑版叫啥名字)

  • 若依框架add页面实现confirm弹窗(若依框架自动生成代码)

    若依框架add页面实现confirm弹窗(若依框架自动生成代码)

  • GPT-4,大增长时代的序幕(增长gdp是什么意思)

    GPT-4,大增长时代的序幕(增长gdp是什么意思)

  • 企业纳税申报表怎么查询
  • 减资需要交个税吗
  • 计提税费如何写分录
  • 金融类企业
  • 自产产品用于职工福利会计处理
  • 增值税发票抵扣勾选平台
  • 红字发票申请表盖什么章
  • 新换财务软件如何登录
  • 支票上哪里填付款人账号
  • 房地产开发企业预缴增值税
  • 一般劳务报酬和税收区别
  • 预算管理如何做好管理会计这一工作
  • 驾驶培训费可以报销吗
  • 券商买卖股票手续费
  • 白条确认收款后还能分期吗
  • 签发票据是什么行为
  • 制造行业运输费包括哪些
  • 房地产开发企业预缴增值税
  • 房地产企业的土地使用税起始时间
  • 境外工资薪金
  • 餐费可以抵扣吗怎么做账
  • 非营业活动交增值税吗
  • 离职补偿金怎么计算
  • 超过认证期限的发票还能认证吗
  • 购买方已抵扣
  • 物流车辆挂靠账务怎么处理?
  • 认缴制下实收资本可以一直为零吗
  • 公司处置车辆税金怎么算
  • 餐查账征收企业所得税会计分录?
  • 超市收代金券如何处理
  • 管理费用和财务费用在资产负债表怎么填
  • 应用程序无法正常启动(0xc0000142)
  • 季度资产总额怎么填写
  • avc格式是什么
  • php编程基础与实例教程
  • 房产税的应纳税额计算方法
  • 向银行借入的资金属于什么
  • thinkphp怎么运行
  • 收到退回的以前年度的劳务费怎么入账
  • 前端promise封装
  • 弥补以前年度亏损报表怎么填
  • 预收账款收了没
  • sqlserver 死锁查询
  • php自动压缩图片
  • 基建拨款在新政府会计制度对应什么科目
  • 固定资产一次性扣除账务处理
  • 企业其他应付款减少说明什么
  • 受疫情影响较大的上市公司
  • 预付账款写到什么凭证
  • 购货方收到销售折扣发票怎么入账
  • 坏账准备具有什么功能
  • 房地产开发企业资质管理规定
  • 固定资产的原价减去预计净残值后的余额
  • 电子承兑汇票到期网银上怎么操作
  • 如何判断企业处于什么阶段
  • 公司支付劳务工资怎么做账
  • 工业企业增值税税率
  • 坏账损失的核算方法包括
  • Linux下卸载MySQL数据库
  • windows10怎么隐藏工具栏
  • ubuntu x
  • centos7关闭kdump
  • 苹果电脑安装虚拟机会有什么影响
  • mac硬盘的常见问题及解决
  • 在Linux操作系统中哪些命令可以正确关闭系统防火墙
  • win7破解版和正版的区别
  • 如何调整输入法框的大小
  • 黑白棋手机游戏
  • 搭建nodejs
  • nodejs.
  • vue wepack
  • [置顶]bilinovel
  • shell 比较大小
  • 键盘搜索的快捷键
  • jquery使用教程
  • 税务部门客服
  • 怎样进行造林面积检查验收
  • 业务招待费进项可以抵扣吗为什么
  • 国家税务总局简易征收最新文件
  • 建筑企业应如何选择适用的质量体系标准
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设