【uniapp】实现列表分页加载数据列表的方法,通过scroll-view下拉刷新,上拉加载的方法即可

 一、实现思路

1、通过上拉触底事件,累加下一页分页的数据到列表最后,并显示加载的效果

2、再判断总页数是否已经累加完成,如果已完成,则提示  “没有数据了” 

二、实现方法

使用scroll-view组件中的触底事件和下拉刷新事件即可

<scroll-view @scrolltolower="lowerBottom" @refresherrefresh="getFresh" scroll-y="true" class="scrollHeight">
	<!-- 此处加列表内容 -->
</scroll-view>

<script lang="ts" setup>
//触底加载
const lowerBottom=()=>{
  //处理触底后的逻辑
}

// 下拉刷新
const getFresh=()=> {
}
</script>

<style lang="scss" scoped>
//必须要设置指定的高度,否则没有触底的效果以及不会触发触底事件
.scrollHeight{
	height: 100vh;
}
</style>

三、以上截图全部代码

<template>
<scroll-view @scrolltolower="lowerBottom" @refresherrefresh="getFresh" scroll-y="true" class="scrollHeight">
	<view class="list" v-if="person.data.list&&person.data.list.length>0">
		<view class="item" v-for="(item,index) of person.data.list" :key="index" @click="toDetail(item)">
			<svg t="1669880074940" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10341" width="50" height="56"><path d="M196.608 102.4c-5.632 0-11.2128 1.024-16.384 3.072a41.472 41.472 0 0 0-13.7216 8.832C158.6176 122.24 153.6 132.1728 153.6 142.08v714.24c0 5.1968 1.1264 10.3424 3.328 15.104 2.2272 4.7872 5.4784 9.088 9.5744 12.672 3.9168 3.7376 8.6016 6.7072 13.7472 8.7296 5.1712 2.048 10.752 3.1232 16.3584 3.1744h630.784c5.632 0 11.2128-1.024 16.384-3.072a41.472 41.472 0 0 0 13.7216-8.832c4.0448-3.6096 7.2448-7.936 9.472-12.6976A36.608 36.608 0 0 0 870.4 856.32V346.5728L631.4752 102.4H196.608z" fill="#859FFF" p-id="10342"></path><path d="M870.4 346.5984h-196.7616a42.7776 42.7776 0 0 1-29.5168-12.928 44.672 44.672 0 0 1-12.672-30.1824V102.4L870.4 346.5984z" fill="#FFFFFF" fill-opacity=".42" p-id="10343"></path><path d="M408.4224 391.5264c0-14.8224 10.4448-20.9152 23.2192-13.6704l207.6928 117.632c12.8 7.2704 12.8 19.072 0 26.3168l-207.6928 117.6064c-12.8 7.2704-23.2192 1.152-23.2192-13.6704v-234.2144z" fill="#FFFFFF" p-id="10344"></path></svg>
			<view class="item_right">
				<view class="item_title">{{item.Name}}</view>
				<view class="collect_btn" @click.stop="cancelCollect(item)">
					<i :class="['iconfont', 'icon-Frame-11']" style="color:#F06F6F;"/>
				</view>
			</view>
		</view>
		<view class="more_text" v-if="person.showMoreData">没有数据了...</view>
	</view>
	<view v-else class="empty_box">
		<image src="@/static/null_icon.png" mode=""></image>
	</view>
</scroll-view>
</template>

<script lang="ts" setup>
import { reactive } from 'vue'
import { GetRemoveCollect } from '@/pages/user/hooks/collect.ts'; // 混入用户操作接口
import { getCollectList } from "@/api/user"
import {onShow} from "@dcloudio/uni-app";
let person:any=reactive({
	// 收藏列表
	data: {
		list: [],
		PageIndex: 1,
		PageSize: 10,
		total: 0
	},
	showMoreData:false
})
// 获取收藏列表
onShow(()=>{
	person.data.PageIndex=1
	uni.pageScrollTo({
	    scrollTop: 0
	});
	GetCollectList()
	if (person.data.PageIndex * person.data.PageSize >= person.data.total) return person.showMoreData=true
})

// 接口收藏列表
let GetCollectList = () => {
	uni.showLoading({title: '加载中'});
	let obj={
	    PageIndex: person.data.PageIndex,
	    PageSize: person.data.PageSize,
	}
	getCollectList(obj).then((res:any) => {
		let {Code,Data}=res.data
		if(Code===200){
			uni.hideLoading();
			person.data.list=[...person.data.list,...Data.Data]
			person.data.total = Data.Total
		}
	})
}

// 跳转至详情
let toDetail = (item:any) => {
	let obj = { Id: item.Id, NodeId: item.NodeId, IsCollect: 1 }
	uni.setStorageSync('setId', JSON.stringify(obj))
	uni.navigateTo({
		url: `/pages/recording/recordDetails`
	});
}
// 取消收藏
const cancelCollect = (item: any) => {
	uni.showModal({
		title: '是否取消收藏?',
		success: function (res) {
			if (res.confirm) {
				// 确定取消收藏
				GetRemoveCollect(item, item.Id, 1)
				// 获取收藏列表
				setTimeout(()=>{
					GetCollectList()
				},200)
			} else if (res.cancel) {
				// 取消
			}
		}
	});
}
//触底加载
const lowerBottom=()=>{
	// 判断是否还有下一页数据
	if (person.data.PageIndex * person.data.PageSize >= person.data.total) return person.showMoreData=true
	// 让页码值自增 +1
	person.data.PageIndex +=1
	// 重新获取列表数据
	GetCollectList()
}
// 下拉刷新
const getFresh=()=> {
}
</script>

<style lang="scss" scoped>
page{
	background: #F5F5F5;
}
.scrollHeight{
	height: 100vh;
	.more_text{
		color: #999;
		font-size: 24rpx;
		text-align: center;
	}
}
.list{
	top: 0rpx;
	padding-bottom: 20rpx;
	.item{
		align-items: center;
		padding: 10rpx 20rpx !important;
	}
	.item_right{
		display: flex;
		align-items: center;
		justify-content: space-between;
		width: 90%;
		margin-left: 10rpx;
		.item_title{
			width: 90%;
			height: inherit !important; 
		}
		.collect_btn{
			i{
				font-size: 40rpx;
				margin-left: 20rpx;
			}
		}
	}
}
</style>

四、避坑

当 scrollHeight 设置了自定义高度时,方法@refresherrefresh 下拉就会失效,

解决方法:需要加上 :refresher-enabled="true" 和 :refresher-triggered="person.triggered",refresher-triggered的初始值为false 要先变为true,执行完刷新操作之后再变为false才会有效果

<scroll-view @scrolltolower="lowerBottom()" :refresher-enabled="true" :refresher-triggered="person.triggered" @refresherrefresh="getFresh()" scroll-x="false" scroll-y="true" class="scrollHeight">
</scroll-view>

<script lang="ts" setup>
import { reactive } from 'vue'
let person:any=reactive({
	triggered:false
})

// 下拉刷新
const getFresh=()=>{
	if(!person.triggered){
		person.triggered = true
		setTimeout(() => {
			person.triggered = false
		},500)
	}
	// 重新获取列表数据
	......
}
</script>

<style lang="scss" scoped>
.scrollHeight{
	height: calc(100vh - 490rpx);
}
</style>

     希望我的愚见能够帮助你哦~,若有不足之处,还望指出,你们有更好的解决方法,欢迎大家在评论区下方留言支持,大家一起相互学习参考呀~

  • 14
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 uniapp下拉刷新组件和列表组件来实现下拉分页加载数据的功能。下面是一个简单的示例代码: 首先,在页面的 template 中添加下拉刷新列表组件: ```html <template> <view> <scroll-view scroll-y="true" @scrolltolower="loadMore"> <refresh refresher-triggered="refreshData"> <view class="list"> <view v-for="(item, index) in dataList" :key="index" class="item"> <!-- 显示数据项的内容 --> </view> </view> </refresh> </scroll-view> </view> </template> ``` 然后,在页面的 script 中定义相关的数据方法: ```javascript <script> export default { data() { return { dataList: [], // 存储加载数据列表 pageNum: 1, // 当前页码 pageSize: 10, // 每页显示的数据数量 isLoading: false, // 是否正在加载数据 }; }, methods: { // 下拉刷新数据 refreshData() { this.pageNum = 1; this.dataList = []; this.loadData(); }, // 加载更多数据 loadMore() { if (this.isLoading) return; this.pageNum++; this.loadData(); }, // 请求加载数据 loadData() { this.isLoading = true; // 发起请求,获取第 pageNum 页的数据 // 可以使用 uni.request 或 uni.$http 等方法发送网络请求 // 请求成功后将返回的数据添加到 dataList 中,如 this.dataList.push(...response.data) // 请求完成后,记得设置 this.isLoading = false; }, }, }; </script> ``` 在上面的代码中,`refreshData` 方法用于下拉刷新数据,会重置页码和数据列表,然后调用 `loadData` 方法加载第一页的数据。`loadMore` 方法用于触底加载更多数据,会增加页码并调用 `loadData` 方法加载下一页的数据。`loadData` 方法中可以使用 uni.request 或 uni.$http 等方法发送网络请求,成功后将返回的数据添加到 dataList 中,并在请求完成后设置 isLoading 为 false。 这样,当用户下拉刷新或触底时,就会触发相应的方法加载新的数据实现下拉分页加载数据的功能。你可以根据实际情况进行相应的修改和优化。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值