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

  • 苹果手机3dtouch称重的设置方法(苹果手机3dtouch电子秤)

    苹果手机3dtouch称重的设置方法(苹果手机3dtouch电子秤)

  • 苹果手表更新不了(苹果手表更新不了怎么回事)

    苹果手表更新不了(苹果手表更新不了怎么回事)

  • 华为手机突然滴滴报警声(华为手机突然滴滴的叫)

    华为手机突然滴滴报警声(华为手机突然滴滴的叫)

  • 酷狗音乐vip过期了下载的歌还能听吗(酷狗音乐vip过期了下载到耳机的歌)

    酷狗音乐vip过期了下载的歌还能听吗(酷狗音乐vip过期了下载到耳机的歌)

  • 快手号是什么(周也的快手号是什么)

    快手号是什么(周也的快手号是什么)

  • 笔记本充电到99不动了(笔记本充电到99充不满正常吗)

    笔记本充电到99不动了(笔记本充电到99充不满正常吗)

  • 怎么解除qq匹配频繁(qq匹配聊天怎么解封)

    怎么解除qq匹配频繁(qq匹配聊天怎么解封)

  • 滴滴时长费怎么计算(滴滴时长计费)

    滴滴时长费怎么计算(滴滴时长计费)

  • 打字生成表情包的输入法(打字生成表情包怎么设置)

    打字生成表情包的输入法(打字生成表情包怎么设置)

  • microsoftwindows没有响应(microsoftwindows没有恢复)

    microsoftwindows没有响应(microsoftwindows没有恢复)

  • 华为怎么设置siri(华为怎么设置siri一喊就出来音乐)

    华为怎么设置siri(华为怎么设置siri一喊就出来音乐)

  • 格式工厂怎么下载到电脑上(格式工厂怎么下载b站视频)

    格式工厂怎么下载到电脑上(格式工厂怎么下载b站视频)

  • 华为c8817d什么型号(华为c8817e是什么型号)

    华为c8817d什么型号(华为c8817e是什么型号)

  • 手机专业拍照使用方法(手机相机专业拍照)

    手机专业拍照使用方法(手机相机专业拍照)

  • 小米手环3nfc和4nfc的区别(小米手环3nfc和小米手环3的区别)

    小米手环3nfc和4nfc的区别(小米手环3nfc和小米手环3的区别)

  • 怎样取消qq密保手机号(怎么取消qq的密保)

    怎样取消qq密保手机号(怎么取消qq的密保)

  • 手机费电怎么解决(手机费电咋处理)

    手机费电怎么解决(手机费电咋处理)

  • 淘口令下单会降权吗(淘口令走大量单子有事吗)

    淘口令下单会降权吗(淘口令走大量单子有事吗)

  • qq群发祝福在哪里找(qq群发祝福哪些节日有)

    qq群发祝福在哪里找(qq群发祝福哪些节日有)

  • excel怎么在日期后面加星期几(excel怎么在日期后面加星期)

    excel怎么在日期后面加星期几(excel怎么在日期后面加星期)

  • 蓝牙收款提示器怎么用(蓝牙收款提示器手机可不可以离开)

    蓝牙收款提示器怎么用(蓝牙收款提示器手机可不可以离开)

  • Linux开机报错unable to load selinux policy的解决方法(linux开机出现grub解决方法)

    Linux开机报错unable to load selinux policy的解决方法(linux开机出现grub解决方法)

  • 海草中的章鱼,法国利翁湾 (© BIOSPHOTO/Alamy)(在海里的章鱼)

    海草中的章鱼,法国利翁湾 (© BIOSPHOTO/Alamy)(在海里的章鱼)

  • 个人独资企业需要交什么税
  • 什么情况下要交土地出让金
  • 百旺金赋的服务费必须交吗
  • 加油电子普通发票可以抵扣增值税吗
  • 营改增后计税依据
  • 合并报表长期股权投资怎么算
  • 残保金超比例奖励
  • 未开票收入怎么写分录
  • 财务费用利息收入的账务处理
  • 一般销售商品业务
  • 全年一次性奖金计税方式
  • 学校应该缴纳的税
  • 联营与参股公司的关系
  • 产品预付款合同如何填写
  • 会员卡系统多少钱一套
  • 劳务派遣个税怎么扣
  • 应付职工薪酬借方负数是什么意思
  • 已经折旧完的固定资产怎么处理
  • win7如何隐藏任务栏正在游戏的图标
  • 清卡处于非征期是什么意思
  • php 如何下载
  • linux bt命令
  • player windows
  • 提租补贴应计入什么科目
  • 税法的构成要素中,()是税法最基本的要素
  • 酒店里用了收费的东西怎么算
  • 资产负债表的编制方法和步骤
  • 拉姆绍在哪里
  • 黑尾鮰鱼
  • 纳库鲁的念能力
  • 厂房改造支出可以计入厂房价值吗
  • 不带息票据按面值入账
  • thinkphp wherein
  • 发放职工薪酬账务怎么做
  • 企业清算所得税政策
  • 多计提费用可以不用以前年度损益调整吗
  • 其他应收款待抵扣进项
  • Windows OpenGL ES 图像曝光度调节
  • dedecms 收费
  • 分公司民事责任由谁承担
  • show processlist
  • 一般计税预缴增值税2%怎么算
  • 股东收到投资收益会计科目
  • 年底要结转净利润怎么算
  • 会计继续教育的发票在哪里打
  • 其他应付款结转收入的条件
  • 银行股分红划算吗
  • 国家高新技术补助
  • 个人向对公账户付款有风险吗
  • 其它综合收益包括
  • 成本类科目会计处理分录
  • 去年未做账的发票怎么查
  • 账务处理程序和财务处理程序
  • debian系统教程
  • winxp/win2000/win2003
  • Linux设置jdk环境变量配置
  • mac的浏览记录在哪儿
  • win8一直在开始界面
  • debian与centos详细对比区别
  • centos的防火墙怎么关
  • win7设置宽带拨号
  • win10 sam文件下载
  • windows7怎么打开注册表
  • win7 64位旗舰版电脑鼠标如何才能设置成左手操作?设置鼠标为左手操作的方法
  • python数据结构与算法分析 第2版(图灵出品)
  • opengl 函数可以在子线程中调用吗
  • opengl颜色代码表
  • nodejs worker
  • python内置函数什么用来返回序列中的最大元素
  • 服务器总是自动关机
  • javascript总结笔记
  • 前端头像裁剪
  • js 不用var
  • 河北网上税务登记流程
  • 天河地税局局长简介
  • 北京市国家税务网
  • 收购烟叶多少公斤违法
  • 国家实行什么制度鼓励电力用户合理调整用电负荷
  • 交叉互查的作用和意义
  • 地税局与税务局的区别
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设