uniapp实现滚动到底部加载更多数据

本文探讨了在大数据场景中,如何通过优化数据加载策略来提高性能,包括数据批量加载的实现技巧和利用uniapp的onReachBottom事件进行页面级滚动加载的示例。同时,介绍了如何在scroll-view组件中配置滚动事件以触发加载更多数据。

如果数据量非常大的话,数据批量加载是一种优化手段,那么,如何实现?

onReachBottom

uniapp的生命周期onReachBottom
页面滚动到底部的事件(不是scroll-view滚到底),常用于上拉加载下一页数据。如使用scroll-view导致页面级没有滚动,则触底事件不会被触发

onReachBottom 示例:

onReachBottom(){
	console.log("我已经滚动到底部了")
}

当页面滚动到底部时就会触发这个事件

在这里插入图片描述

这种方式适用于单个页面,如果同一个页面有多处滚动,那么就该使用scroll-view

scroll-view

可滚动视图区域。用于区域滚动

scroll-view 示例:

<scroll-view scroll-y="true" @scrolltolower="lower()" :style="{height:scrollH+'rpx'}">
	// 内容
</scroll-view>
methods:{
		lower(e)
		{
			console.log("已经滚动到底部了")
		}	
	},
computed:{
		scrollH:function(){
			let sys = uni.getSystemInfoSync();
			let winWidth = sys.windowWidth;
			let winrate = 750/winWidth;
			let winHeight =parseInt(sys.windowHeight*winrate)
			return winHeight	
		}
	}

使用竖向滚动时,需要给 一个固定高度,通过 css 设置 height
详见:uniapp中scroll view高度适应问题

当页面滚动到底部时

在这里插入图片描述
实现滚动到底部加载更多数据思路详见 https://blog.youkuaiyun.com/sslcsq/article/details/108294604

### 实现 scroll-view 组件滚动底部时自动加载更多 为了使 `scroll-view` 组件能够检测到滚动底部并触发加载更多数据的操作,在 `scroll-view` 中需设置特定属性来监控滚动位置。由于默认情况下页面级别的 `onReachBottom` 不会因 `scroll-view` 的存在而触发,因此需要自定义逻辑处理。 #### 设置 scroll-view 属性 通过给 `scroll-view` 添加 `@scrolltolower` 事件绑定函数,可以实现当用户滚动到达容器底部时调用指定方法执行进一步操作: ```html <template> <view class="container"> <!-- 启用纵向滚动 --> <scroll-view :scroll-y="true" @scrolltolower="loadMoreData" lower-threshold="50"> <!-- 距离底部多少像素时触发 --> <!-- 列表项渲染区域 --> <block v-for="(item, index) in dataList" :key="index"> <text>{{ item }}</text> </block> <!-- 加载提示符 --> <loading-indicator v-if="isLoading"></loading-indicator> </scroll-view> </view> </template> ``` 上述代码片段展示了如何配置 `scroll-view` 来响应接近底部的行为[^1]。 #### 数据与状态管理 在脚本部分维护列表的数据源以及加载标志位的状态变化: ```javascript <script setup> import { ref } from 'vue'; // 假定初始有十条数据 const dataList = ref(Array.from({ length: 10 }, (_, i) => `Item ${i}`)); let currentPage = 1; const isLoading = ref(false); async function loadMoreData() { if (isLoading.value || !dataList.value.length % 10 === 0) return; try { isLoading.value = true; // 模拟异步请求获取新一批次的数据 await new Promise(resolve => setTimeout(() => resolve(), 1000)); const nextPageItems = Array.from( { length: 10 }, (_, idx) => `Item ${(currentPage++) * 10 + idx}` ); dataList.value.push(...nextPageItems); } finally { isLoading.value = false; } } </script> ``` 此段 JavaScript 代码实现了分页加载机制,并确保每次只会在必要时候发起新的加载请求。 #### 注意事项 - **lower-threshold 参数**:用于设定距离底部多远的距离内触发 `scrolltolower` 事件;单位为 px。 - 当前例子假设每一页固定返回相同数量的新项目(比如这里取的是十个),实际开发中应根据 API 返回调整逻辑。 - 如果网络延迟较大或服务器端无法及时提供下一页的内容,则应在界面上给予适当反馈告知用户当前处于等待状态。 - 对于首次进入视图的情况,可能不需要立即显示加载指示器,除非确实开始了额外的数据拉取过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值