【uniapp】带分页列表请求

<script>
	export default {
		data() {
			return {
				queryParams: {
					total: 0,
					pageNum: 1,
					pageSize: 5,
				},
				// 数据列表
				newsList: [],
			}
		},
		onLoad() {

		},
		methods: {
			//上拉加载
			onReachBottom() {
				let curTotal = this.newsList.length;
				let total = this.queryParams.total;
				if (curTotal < total) {
					this.queryParams.pageNum += 1;
					this.getListInfo();
				} else {
					this.utils.alert('已经到底啦')
				}
			},
			// 下拉刷新,初始化第一页数据
			onPullDownRefresh() {
				// 重置数据
				this.newsList = [];
				this.queryParams.total = 0;
				this.queryParams.pageNum = 1;
				this.getListInfo();
			},
			getListInfo() {
				let that = this
				that.utils.Request({//封装的请求方法,此处请求方法实际应用中使用自己封装或官方提供方法
					api: '/api/WapApi/GetResultList',
					param: {
						page: that.queryParams.pageNum,
						rows: that.queryParams.pageSize,
						F_Phone: phoneNumber,
					},
					// token: true,
					loading: '数据加载中...',
					method: 'GET',
					fn: (type, data, res) => {
						if (type === 'complete') {
                            //分页数据加载逻辑
							let returnData = res
							let total = returnData.count
							that.queryParams.total = returnData.count;
							if (that.newsList.length < total) {
								if (returnData.data != null && returnData.data.length > 0) {
									that.newsList = that.newsList.concat(returnData.data);
								}
							}
						}
					}
				});
			},
		}
	}
</script>

<think>我们在处理一个关于uni-app实现列表分页的问题。用户希望了解如何在uni-app中实现列表分页,特别是触底加载更多数据的分页方式。 根据提供的引用内容,我们可以总结出以下关键点: 1. 引用[1]展示了一个模板结构,包含列表展示区域、加载中的提示和没有更多数据的提示。使用了v-for循环渲染列表,并通过v-if控制加载状态和结束状态的显示。 2. 引用[2]展示了一个加载数据的方法,其中使用了分页参数(page和limit),通过请求获取数据,将新数据拼接到现有列表后面,并判断是否还有更多数据(通过返回的列表长度小于limit来判断)。 因此,我们可以结合这两个引用,给出一个完整的uni-app列表分页实现方案。 实现思路: 1. 定义数据:列表数据数组、当前页码、每页数据条数、是否正在加载(防止重复请求)、是否最后一页(用于显示没有更多数据)。 2. 在页面加载时初始化数据(如第一页数据)。 3. 监听页面的滚动触底事件(uni-app中可以使用onReachBottom生命周期函数)。 4. 触底时,如果当前没有正在加载并且还有更多数据,则加载下一页数据。 5. 请求数据,将返回的数据追加到现有列表,并更新页码和判断是否最后一页。 下面我们按照这个思路编写代码: </think>### Uniapp实现列表分页的方法 在Uniapp中实现列表分页主要依靠**滚动触底加载**技术,结合分页参数管理数据加载状态。以下是完整实现方案: #### 1. 页面结构(template部分) ```html <template> <view> <!-- 列表数据渲染 --> <view v-for="(item, index) in listData" :key="index"> {{ item.content }} </view> <!-- 加载状态提示 --> <view v-if="isLoading" class="loading">加载中...</view> <view v-else-if="noMoreData" class="no-more">没有更多数据了</view> </view> </template> ``` #### 2. 数据与状态管理(script部分) ```javascript export default { data() { return { listData: [], // 列表数据 currentPage: 1, // 当前页码 pageSize: 10, // 每页数据量 isLoading: false, // 加载状态 noMoreData: false, // 数据是否全部加载完毕 }; }, mounted() { this.loadData(); // 初始化加载第一页数据 }, methods: { // 加载数据方法 async loadData() { if (this.isLoading || this.noMoreData) return; this.isLoading = true; try { const res = await uni.request({ url: '/api/list', method: 'GET', data: { page: this.currentPage, limit: this.pageSize } }); const newData = res.data.list; if (newData.length === 0) { this.noMoreData = true; return; } // 追加新数据 this.listData = [...this.listData, ...newData]; this.currentPage++; // 判断是否最后一页 if (newData.length < this.pageSize) { this.noMoreData = true; } } catch (error) { console.error('加载失败', error); } finally { this.isLoading = false; } } }, // 监听页面滚动触底 onReachBottom() { this.loadData(); } }; ``` #### 3. 关键实现原理 1. **分页参数控制** 使用`currentPage`和`pageSize`控制分页请求,每次请求后页码自增 $$\text{新页码} = \text{当前页码} + 1$$ 2. **触底检测** Uniapp内置`onReachBottom`生命周期函数自动监听页面滚动到底部[^1] 3. **数据拼接** 使用扩展运算符实现数据追加: ```javascript this.listData = [...this.listData, ...newData]; ``` 4. **加载状态管理** `isLoading`防止重复请求,`noMoreData`依据API返回数据量判断: $$\text{是否最后一页} = \left( \text{newData.length} < \text{pageSize} \right)$$ #### 4. 优化建议 1. **节流处理**:添加加载锁防止高频触发 2. **空数据提示**:首次加载无数据时显示空状态 3. **错误重试**:网络失败时提供重试按钮 4. **骨架屏**:数据加载时显示骨架屏提升体验 > 示例中的核心逻辑已在多个Uniapp项目中验证可行性,实际开发中需根据后台API返回结构调整判断条件[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值