uniapp 开发小程序虚拟长列表万条数据不卡顿

这篇具有很好参考价值的文章主要介绍了uniapp 开发小程序虚拟长列表万条数据不卡顿。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 页面滚动

uniapp 开发小程序虚拟长列表万条数据不卡顿

虚拟列表 只对可见区域进行渲染,对非可见区域中的数据不渲染或部分渲染,以实现减少消耗,提高用户体验的技术。它是长列表的一种优化方案,性能良好。当数据体量极大时,使用虚拟列表,可以极大减少节点的渲染,体验丝滑。

<template>
	<view>			
		<!--height值为所有数据总高-->
		<view :style="{height: itemHeight*(listAll.length) + 'px', position: 'relative'}">
			
			<!--可视区域里所有数据的渲染区域-->
			<view :style="{position: 'absolute', top: top + 'px'}">
				
				<!--单条数据渲染区域-->
				<view class="item" v-for="(item,index) in showList" :key="index" >
					<image src="../../static/01.png" mode="aspectFill" style="height: 100px; width: 100px;"></image>
					{{item}}
				</view>
			</view>
		</view>		
	</view>
</template>

<script>
	export default {    
		data(){
			return{
				listAll: [],  //所有数据
				showList: [],  //可视区域显示的数据				
				itemHeight: 105, //每条数据所占高度
				showNum: 10,  //每次加载到可视区域的数量,itemHeight X showNum 要大于屏幕高度 ,否则页面滚动不了。
				top: 0, //偏移量
				scrollTop: 0,  //卷起的高度
				startIndex: 0,  //可视区域第一条数据的索引
				endIndex: 0,  //可视区域最后一条数据后面那条数据的的索引,因为后面要用slice(start,end)方法取需要的数据,但是slice规定end对应数据不包含在里面				
			}
		},
		
		/*页面滚动事件*/
		onPageScroll(e) {						
			this.scrollTop = e.scrollTop			
			this.getShowList()			
		},
		
		onLoad() {
			this.getAllList()
			this.getShowList()
		},
		
		methods:{
			//构造2万条数据
			getAllList(){
				for(let i=0;i<20000;i++){
					this.listAll.push(`我是第${i}号佳丽`)
				}				
			},
			
			//计算可视区域数据
			getShowList(){				
				this.startIndex = Math.floor(this.scrollTop/this.itemHeight);   //可视区域第一条数据的索引
				this.endIndex = this.startIndex + this.showNum;   //可视区域最后一条数据的后面那条数据的索引
				this.showList = this.listAll.slice(this.startIndex, this.endIndex)  //可视区域显示的数据,即最后要渲染的数据。实际的数据索引是从this.startIndex到this.endIndex-1
				this.top = this.scrollTop - (this.scrollTop % this.itemHeight);  //在这需要获得一个可以被itemHeight整除的数来作为item的偏移量,这样随机滑动时第一条数据都是完整显示的
			}
			
			
		}
		
	}
</script>

<style scoped>	
	.item{
		height:105px;
		padding: 5px;
		color: #666;
		box-sizing: border-box;
	}
</style>

2. 区域滚动

uniapp 开发小程序虚拟长列表万条数据不卡顿

可滚动视图区域 scroll-view 用于区域滚动。需注意在webview渲染的页面中,区域滚动的性能不及页面滚动。
使用竖向滚动时,需要给 一个固定高度,通过 css 设置 height;使用横向滚动时,需要给添加white-space: nowrap;样式。文章来源地址https://www.toymoban.com/news/detail-513634.html

<template>
	<view>		
		<scroll-view class="scroll-box" scroll-y="true" @scroll="scrollEvent">
			
			<!--可视区域里所有数据的渲染区域-->
			<view :style="{position: 'absolute', top: top + 'px'}">
				
				<!--单条数据渲染区域-->
				<view class="item" v-for="(item,index) in showList" :key="index" >
					<image src="../../static/01.png" mode="aspectFill" style="height: 100px; width: 100px;"></image>
					{{item}}
				</view>
			</view>
		</scroll-view>		
	</view>
</template>

<script>
	export default {    
		data(){
			return{
				listAll: [],  //所有数据
				showList: [],  //可视区域显示的数据				
				itemHeight: 105, //每条数据所占高度
				showNum: 6,  //每次加载到可视区域的数量,itemHeight X showNum 要可视区域高度 ,否则页面滚动不了。
				top: 0, //偏移量
				scrollTop: 0,  //卷起的高度
				startIndex: 0,  //可视区域第一条数据的索引
				endIndex: 0,  //可视区域最后一条数据后面那条数据的的索引,因为后面要用slice(start,end)方法取需要的数据,但是slice规定end对应数据不包含在里面				
			}
		},
				
		onLoad() {
			this.getAllList()
			this.getShowList()
		},
		
		methods:{
			//构造2万条数据
			getAllList(){
				for(let i=0;i<20000;i++){
					this.listAll.push(`我是第${i}号佳丽`)
				}				
			},
			
			//计算可视区域数据
			getShowList(){				
				this.startIndex = Math.floor(this.scrollTop/this.itemHeight);   //可视区域第一条数据的索引
				this.endIndex = this.startIndex + this.showNum;   //可视区域最后一条数据的后面那条数据的索引
				this.showList = this.listAll.slice(this.startIndex, this.endIndex)  //可视区域显示的数据,即最后要渲染的数据。实际的数据索引是从this.startIndex到this.endIndex-1
				this.top = this.scrollTop - (this.scrollTop % this.itemHeight);  //在这需要获得一个可以被itemHeight整除的数来作为item的偏移量,这样随机滑动时第一条数据都是完整显示的
			},
			
			//区域滚动事件
			scrollEvent(e){				
				this.scrollTop = e.detail.scrollTop
				this.getShowList()	
			}
			
			
		}
		
	}
</script>

<style scoped>	
	.item{
		height:105px;
		padding: 5px;
		color: #666;
		box-sizing: border-box;
		
	}
	.scroll-box{
		height: 300px; 
		width: 99%; 
		position: relative; 
		border: 1px solid red;
		margin-top: 100px;
	}
</style>

到了这里,关于uniapp 开发小程序虚拟长列表万条数据不卡顿的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp开发小程序-有分类和列表时,进入页面默认选中第一个分类

    如下图所示,进入该页面后,默认选中第一个分类,以及第一个分类下的列表数据。 关键代码: 进入页面时,默认调用分类的接口,在分类接口里做判断: 完整代码:

    2024年02月12日
    浏览(41)
  • 解决ElementUI列表大数据操作卡顿问题

    问题描述 前端UI框架使用的是ElementUI,项目要求数据不分页一个表格至少要1000条数据,这时点击其他DOM操作,会出现卡顿的现象。如点击复选框。 官网的示例也搞了,超过200行后操作就会卡很久,比如复选框 基于elementUI的table,在不修改源码的情况下支持大数据了渲染的场景

    2024年02月11日
    浏览(32)
  • uniapp 微信小程序 Picker下拉列表数据回显问题

    效果图: 1、template 2、data 3、methods

    2024年02月16日
    浏览(44)
  • uniapp小程序中使用video视频播放卡顿

    问题:在使用uniapp小程序的video视频播放,视频已经在播放了,但是进度条没走,还是卡顿的状态(测试ios能正常使用,安卓手机会出现此问题) 在网上找了很多方法,最多的说是用:custom-cache=\\\"false\\\",试了并没有效果,看来和我问题不一样,后来用了个简单粗暴的方法,发现是有效果的,以下是

    2024年04月11日
    浏览(45)
  • vue大数据表格上万条数据,树型表格,解决el-table表格数据量过大渲染卡死的问题,使用umy-ui的大数据表格虚拟表格虚拟滚u-table解决。

    先看看效果吧,拿实例说话,直接渲染四万多条数据不分页,树形表格可以展开 直接上代码: 第一步:引入表格组件:自行按照官方文档引入即可 第二步:具体页面实现代码: 这是HTMl代码,多的不介绍,基本方法和el-atble没什么区别,只是tl-table的基础上加了几个属性,这

    2024年02月11日
    浏览(52)
  • 【uniapp小程序】打印列表UI模板

    这是一个云打印项目,首页查询接口渲染设备,设备是否在线是通过redis进行判断的,当设备在线时可以通过在线的驱动软件打印用户提交的文档,自动处理无需人工干预 今天主要是分享一下,文件列表界面,由于UI太丑于是我换了下,如图所示: 框架为uView2.0,代码如下:

    2024年02月11日
    浏览(38)
  • uniapp 微信小程序 城市索引列表

    最近做的一个项目需要频繁用到城市列表切换,切换城市,腾讯地图虽然有地图列表,但是效果不是自己项目想要的,于是就结合结合uview的IndexList 索引列表重新做了一个城市列表的页面 效果图:  页面结构:address.vue script代码: QQMapWX:腾讯地图sdk cityCode:城市列表处理的数

    2024年02月07日
    浏览(41)
  • 【移动端应用开发】 以 uniapp 打包成 APP 或小程序后或 H5 后 IOS(iphoneX 机型)底部安全区域适配(避开底部黑条虚拟键)

    一、前言 在使用 uniapp 进行应用开发时,可能会遇到应用在 iPhone X 等带有底部安全区域的机型上显示不正常的问题。这是因为 iPhone X 及之后的机型采用了全面屏设计,屏幕底部有一个黑色的虚拟键区域,俗称\\\"刘海\\\"或\\\"黑条\\\"。为了避免应用内容被底部安全区域遮挡,需要进行

    2024年02月19日
    浏览(74)
  • 实现原生微信小程序虚拟列表

    小程序的setData每一次调用,都会重新和旧的虚拟dom进行diff对比,如果页面列表比较大的话,不断频繁加载setData,实际上是非常消耗性能的,所以也是为了解决这个考虑,我虽然每一次都在使用setData加载数据,但是setData加载完成的数据,我并不是直接渲染,而是通过wxml中微

    2024年02月11日
    浏览(52)
  • uniapp:聊天消息列表(好友列表+私人单聊)支持App、H5、小程序

          🎬 江城开朗的豌豆 :个人主页  🔥 个人专栏  :《 VUE 》 《 javaScript 》  📝  个人网站  :《 江城开朗的豌豆🫛 》  ⛺️ 生活的理想,就是为了理想的生活 ! 目录  ⭐  文章简介(效果图展示)           📟 插件传送门:聊天消息列表  📘  文章背景

    2024年04月15日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包