取消上拉加载 微信小程序_微信小程序:上拉加载更多

本文详细介绍了微信小程序中如何实现上拉加载更多功能,包括初始加载、滚动触发加载、请求数据处理、防止多次请求、处理数据为空及请求失败的场景,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

无论是微信小程序还是其他前端框架,都会遇到上拉加载(懒加载)和下拉刷新这种问题。其实理清楚什么时候请求数据、请求返回的几种情况,那么做这个懒加载就很简单了。

一、首先,固定一个包含列表数据的view高度,让它里面列表的数据溢出可以滚动:

Item{{item}}

二、那么列表的数据请求就会分成两种情况:一种是初始化页面加载的第一页的数据;一种是滚动到底部请求的下一页的数据。所以我们在请求时要分成两种情况,若是第一页,isPage=false,下一页的数据isPage=true:

//请求数据

getData(isPage) {

console.log("需要拼接数据:", Network.pageData);

let params = {

pageNum: this.data.pageNo,

pageSize: 30

}

//请求

Network.pageData(params,(res,err)=>{

if (isPage) {

//下一页的数据拼接在原有数据后面

this.setData({

listData: this.data.listData.concat(res.result)

})

} else {

//第一页数据直接赋值

this.setData({

listData: res.result

})

}

})

},

三、步骤一提到的固定高度的view,它在往上滚动的时候,滚动到一定的位置便请求下一页的数据。我这里设置了当view距离到底部还有100px时,触发请求下一页的数据:

//到达底部

scrollToLower: function (e) {

this.setData({

pageNo: this.data.pageNo + 1

})

this.getData(true);

},

四、以上便是基本的上拉加载。通过以上步骤会出现几个问题,下面提供解决方法:

1、滚动离底部<100px之后,继续往底部滚动会一直发起请求。我们需要在view距离到底部还有100px时,设置一个全局变量loading,告诉大家我已经发起请求了,等我请求返回的数据展示到页面之后才可以再次发起请求。将步骤三的代码改成以下:

//到达底部

scrollToLower: function (e) {

if (!this.data.loading){

this.setData({

loading: true,

pageNo: this.data.pageNo + 1

})

this.getData(true);

}

},

步骤二的代码改为:

//请求数据

getData(isPage) {

console.log("需要拼接数据:", Network.pageData);

let params = {

pageNum: this.data.pageNo,

pageSize: 30

}

//请求

Network.pageData(params,(res,err)=>{

this.setData({

loading: false

})

if (isPage) {

//下一页的数据拼接在原有数据后面

this.setData({

listData: this.data.listData.concat(res.result)

})

} else {

//第一页数据直接赋值

this.setData({

listData: res.result

})

}

})

},

2、如果最后一页的数据都请求完了,再继续往下滚动还会发起请求。设置一个全局变量noMore,当我请求返回的数组长度为0时,滚动到底部就不用再发起请求了。将步骤三的代码改成以下:

//到达底部

scrollToLower: function (e) {

if (!this.data.loading && !this.data.noMore){

this.setData({

loading: true,

pageNo: this.data.pageNo + 1

})

this.getData(true);

}

},

步骤二的代码改为:

//请求数据

getData(isPage) {

console.log("需要拼接数据:", Network.pageData);

let params = {

pageNum: this.data.pageNo,

pageSize: 30

}

//请求

Network.pageData(params,(res,err)=>{

this.setData({

loading: false

})

if (isPage) {

//下一页的数据拼接在原有数据后面

this.setData({

listData: this.data.listData.concat(res.result)

})

} else {

//第一页数据直接赋值

this.setData({

listData: res.result

})

}

//如果返回的数据为空,那么就没有下一页了

if (res.result.length == 0) {

this.setData({

noMore: true

})

}

})

},

五、我们接下来完善请求失败的情况,步骤二的代码改为:

//请求数据

getData(isPage) {

console.log("需要拼接数据:", Network.pageData);

let params = {

pageNum: this.data.pageNo,

pageSize: 30

}

//请求

Network.pageData(params,(res,err)=>{

this.setData({

loading: false

})

if (err) {//返回失败

this.setData({

loadingFailed: true

})

return false;

}

if (res.code == 0) {

if (isPage) {

//下一页的数据拼接在原有数据后面

this.setData({

listData: this.data.listData.concat(res.result)

})

} else {

//第一页数据直接赋值

this.setData({

listData: res.result

})

}

//如果返回的数据为空,那么就没有下一页了

if (res.result.length == 0) {

this.setData({

noMore: true

})

}

} else {

//返回失败

this.setData({

loadingFailed: true

})

}

})

},

步骤一的HTML代码修改如下:

Item{{item}}

加载中...

没有更多了

数据加载失败,请重试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值