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

  • 新浪微博增加高质量粉丝的技巧有哪些?(微博增高长高分享达人)

    新浪微博增加高质量粉丝的技巧有哪些?(微博增高长高分享达人)

  • vivo手机收到消息不显示内容(vivo手机收到消息为什么会震动)

    vivo手机收到消息不显示内容(vivo手机收到消息为什么会震动)

  • 朋友圈个签在哪改(朋友圈个签图案)

    朋友圈个签在哪改(朋友圈个签图案)

  • 朋友圈删评论对方能看到吗(朋友圈删评论对方能提示吗)

    朋友圈删评论对方能看到吗(朋友圈删评论对方能提示吗)

  • 三星buds和三星buds区别(三星buds和三星buds+音质区别)

    三星buds和三星buds区别(三星buds和三星buds+音质区别)

  • 开机logo过后黑屏(过完开机logo就黑屏)

    开机logo过后黑屏(过完开机logo就黑屏)

  • nova6闪存是多少(华为nova6内存和闪存规格)

    nova6闪存是多少(华为nova6内存和闪存规格)

  • j型热电偶与K型有什么不同(j型热电偶和k型热电偶可以互换吗)

    j型热电偶与K型有什么不同(j型热电偶和k型热电偶可以互换吗)

  • 机箱上面的风扇进风还是出风(机箱上面的风扇是正面还是反面装)

    机箱上面的风扇进风还是出风(机箱上面的风扇是正面还是反面装)

  • ipad冲半天电没充进去(ipad冲半天电没充进去怎么办,会不会是冬天太冷)

    ipad冲半天电没充进去(ipad冲半天电没充进去怎么办,会不会是冬天太冷)

  • 红米k20pro长宽高(红米k20pro长宽多少)

    红米k20pro长宽高(红米k20pro长宽多少)

  • OPPOr17怎样使用typec耳机(oppor17pro怎么用)

    OPPOr17怎样使用typec耳机(oppor17pro怎么用)

  • 为什么xr是单卡(为什么我的苹果xr是单卡的)

    为什么xr是单卡(为什么我的苹果xr是单卡的)

  • blackview是哪国品牌(black是什么产品)

    blackview是哪国品牌(black是什么产品)

  • 图像文件是什么媒体(图像文件是什么文件格式)

    图像文件是什么媒体(图像文件是什么文件格式)

  • 如何删除word2010占位符(如何删除Word水印)

    如何删除word2010占位符(如何删除Word水印)

  • excel中日期格式1984-07-07怎么输入(Excel中日期格式怎么转换成文本)

    excel中日期格式1984-07-07怎么输入(Excel中日期格式怎么转换成文本)

  • 抖音拍摄的视频怎么剪辑(抖音拍摄的视频怎么调倍速)

    抖音拍摄的视频怎么剪辑(抖音拍摄的视频怎么调倍速)

  • 抖音随拍和视频区别(抖音随拍视频合集简介)

    抖音随拍和视频区别(抖音随拍视频合集简介)

  • 爱奇艺可以播放本地视频吗(爱奇艺可以播放什么格式的视频)

    爱奇艺可以播放本地视频吗(爱奇艺可以播放什么格式的视频)

  • koreader是什么(korea是什么牌子)

    koreader是什么(korea是什么牌子)

  • python机器人编程——差速机器人小车的控制,控制模型、轨迹跟踪,轨迹规划、自动泊车(上)(python机器人编程控制)

    python机器人编程——差速机器人小车的控制,控制模型、轨迹跟踪,轨迹规划、自动泊车(上)(python机器人编程控制)

  • PHPCMS v9 怎么换模板?(phpcms v9安装教程)

    PHPCMS v9 怎么换模板?(phpcms v9安装教程)

  • 已抵扣进项税额转出怎么申报
  • 内含报酬率指
  • 买新车时旧车置换新车划算吗
  • 无形资产摊销计算例题
  • 已经缴纳的税款怎么做账
  • 主营业务收入开普票怎么记账
  • 合同违约金账务处理
  • 制造业印花税计税,按照去税金额计算
  • 无形资产的加计扣除为什么不影响应纳税所得额
  • 固定资产忘了折旧有什么影响
  • 过路过桥费抵扣2021新规定
  • 取得增值税专用发票
  • 确认的投资收益
  • 企业发生什么
  • 印花税漏报了要罚款吗
  • 2017企业所得税小微企业优惠政策
  • 增值税专用发票可以开电子发票吗
  • 建筑业月末账务处理
  • 中小企业划分标准
  • 车辆购置税通过应交税费吗
  • 小规模季报资产总额填错了有影响吗
  • 原本可以打开的软件
  • vpn加速有什么用呢?
  • vue项目如何搭建
  • php如何使用session
  • 网站防止被刷票怎么解决
  • 电冰箱一天用多少电费正常
  • 土地增值税清算收入如何确定
  • 应交增值税视频讲解
  • php occ
  • 应收罚款收入
  • php中的include
  • 预提的奖金需要缴纳个人所得税吗
  • vue项目使用rem
  • vue脚手架配合springsecurity
  • php execute函数
  • 增值税直接减免税额要交企业所得税吗
  • 成本票和费用票一样吗
  • 固定资产转为投资性房地产公允价值
  • 工资表中可以出现减号的情况吗
  • 织梦的首页怎么换图片
  • 所得税费用可以计入税金及附加吗
  • 建筑企业开票都要交税吗
  • 受雇于两家公司补税怎么算
  • 公司借款利息可以约定由某一股东承担
  • 纳税人按照月度或者季度的实际利润额预缴有困难的
  • access untagged
  • access的数据源在哪里设置
  • 允许加计扣除的新技术研究开发费用是
  • 企业出租房产增值税怎么计算
  • 小规模纳税人水利基金税率
  • 房地产企业取得政府补助
  • 确认收入后销售怎么算
  • 不含税销售额等于净利润
  • 物业费是否需要物价局备案
  • 个体户开广告发票需要交税吗
  • 暂估入库一直没有发票
  • sqlserver查询数据库表名
  • 外接法实物图
  • w7系统删除所有东西
  • 2021年win10累积更新
  • windows临时文件在哪里
  • 根据自己的需求配置一台电脑
  • centos 编译安装
  • fsrremos.exe
  • win8 休眠
  • linux系统开发环境
  • flask操作mysql数据库
  • js创建元素
  • nodejs mocha
  • Android-ViewPager使用示例
  • js倒计时结束操作
  • node.js入门
  • javascript中的条件控制语句有哪些?
  • canvas+javascript
  • python各进制符号
  • python async
  • 北京市地方税务局发票查验
  • 上海《居住登记凭证》
  • 湖南银税进件中心
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设