小程序长列表显示:dom元素超出限制,如何解决空屏问题?

news/2024/7/20 2:13:28 标签: 小程序

用于解决长列表dom渲染溢出造成的空白无法显示问题。

思路:借助scroll-view的scroll事件的事件对象中的scrollTop的值判断当前用户可视的第一个元素的index,用v-if控制当前可视元素的前10个item和后10个item渲染,其他的不渲染,达到局部渲染的效果,从而解决dom溢出的问题。item的作用是保留高度,使滚动条保持正常位置。


前提条件是list里面的item的height要一样,才能计算出当前可视的元素的index。

示意图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jPQfPgdq-1619074308336)(E:\work\problem_pic\长列表可视元素位置计算.png)]

1)不分页情况

html结构如下:

	<scroll-view scroll-y="true" @scroll="scroll" :style="'height: 800rpx;background-color: #f0f0f6;'">
		<view class="list">
			<view class="item" v-for="(item,childIndex) in 100" :key="childIndex">
				<view class="hide" v-if="currentItem - 10 < childIndex+1 && currentItem + 10 > childIndex+1">
					123
				</view>
			</view>
		</view>
	</scroll-view>

scss样式如下:

	.list{
		.item{
			height: 200rpx;
			margin-bottom: 20rpx;
			background-color: pink;
		}
	}

javascript代码如下:

		data() {
			return {
				currentItem:1  // 默认当前可视的item元素是第一个
			}
		},
		methods: {
			scroll(e){
				const itemHeight = 220/2  // 除以2是因为scrollTop的值单位是px,而元素高度的单位是rpx
				this.currentItem = Math.floor(e.detail.scrollTop / itemHeight) + 1
			}
		}

效果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SqjlKR45-1619074308343)(C:\Users\cl\AppData\Roaming\Typora\typora-user-images\image-20201119152640095.png)]

2)分页情况

html结构如下:

	<scroll-view scroll-y="true" @scroll="scroll" @scrolltolower="lower" :style="'height:800rpx;'" lower-threshold="100">
        <view class="list">
            <view :class="'page'+index" v-for="(page,index) in dataList" :key="index">
                <view class="item" v-for="(item,childIndex) in page" :key="childIndex">
                    <view class="hide" v-if="currentPage-2 < index+1 && currentPage+2 > index+1">
                        123
                    </view>
                </view>
            </view>
        </view>
	</scroll-view>

scss样式如下:

	.list{
		.item{
			height: 200rpx;
			margin-bottom: 20rpx;
			background-color: pink;
		}
	}

javascript代码如下:

		data() {
			return {
				dataList:[],
				currentPage:1,
				page:1,
				total:1122,
				size:10
			}
		},
		computed:{
			isFinish(){
				if(this.total !== 0 && this.page >= Math.ceil(this.total / this.size)){
					return true
				}
				return false
			},
		},
		methods: {
			getData(){
                // 发请求获取数据,此处仅为模拟。
				let pageList = []
				for(var i=0;i<this.size;i++){
					pageList.push(i)
				}
                // 将请求数据插入数据列表,得到二维数组。
				this.dataList.push(pageList)
			},
			scroll(e){
				const pageHeight = this.size*220/2
				this.currentPage = Math.floor(e.detail.scrollTop / pageHeight) + 1
			},
			lower(){
				if(this.isFinish) {
					return 
				}
				this.page += 1
				this.getData()
			},
		},
		onLoad(){
			this.getData() // 先加载第一页数据
		}

效果如下:(当前第五页,则渲染第3,4,5页的数据,第1,2页的数据不渲染)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wb1uthtK-1619074308344)(C:\Users\cl\AppData\Roaming\Typora\typora-user-images\image-20201119160849337.png)]


http://www.niftyadmin.cn/n/909003.html

相关文章

commons-lang3-3.4类库

一篇关于apache commons类库的详解&#xff1a; http://www.tuicool.com/articles/iyEbquE 转载于:https://www.cnblogs.com/yiran-yeyeshengxiao/p/5506392.html

横向滚动如何实现?

1)scroll-view实现 html结构如下&#xff1a; <scroll-view class"scroll" scroll-x"true" style"height: 80px;"><view class"item" v-for"(item,index) in 5" :key"index"><view class"n…

R语言-缺失值处理2

数据预处理与R语言 前言 最近正在学习数据挖掘方面知识&#xff0c;前前后后也查阅了不少资料。但是总是一个人学习&#xff0c;有点枯燥&#xff0c;所以就想着分享些资料。也是意在找点同道中人交流学习&#xff0c;亦或是大神指导下&#xff08;这个当然更好><&#x…

小程序提交新数据后如何返回上一页并刷新数据?

uni.navigateBack(); 提交完成后返回上一页需要刷新数据的页面&#xff0c;在onShow里调刷新数据的函数。 两步即可实现数据刷新啦~

scoll滚动

【前端性能】高性能滚动 scroll 及页面渲染优化 最近在研究页面渲染及web动画的性能问题&#xff0c;以及拜读《CSS SECRET》&#xff08;CSS揭秘&#xff09;这本大作。 本文主要想谈谈页面优化之滚动优化。 主要内容包括了为何需要优化滚动事件&#xff0c;滚动与页面渲染的关…

JavaScript-学习一_var

JavaScript 数据类型 字符串&#xff08;String&#xff09;、数字(Number)、布尔(Boolean)、数组(Array)、对象(Object)、空&#xff08;Null&#xff09;、未定义&#xff08;Undefined&#xff09;。 <!DOCTYPE html><html><body> <script>var pers…

前端开发面试总结(2021/5/11)

文章目录1. 数组去重方法&#xff0c;最简方法。&#xff08;3&#xff09;2. this指向&#xff08;2&#xff09;3. call、apply和bind4. typeof和instanceof&#xff08;2&#xff09;5. 跨域&#xff08;5&#xff09;6. 闭包及优点&#xff08;3&#xff09;7. 原型链&…

hiho #1283 hiho密码 [Offer收割]编程练习赛3

#1283 : hiho密码 时间限制:10000ms单点时限:1000ms内存限制:256MB描述 小Ho根据最近在密码学课上学习到的知识&#xff0c;开发出了一款hiho密码&#xff0c;这款密码的秘钥是这样生成的&#xff1a;对于一种有N个字母的语言&#xff0c;选择一个长度为M的单词&#xff1b;将组…