Vue?uni-app框架實(shí)現(xiàn)上拉加載下拉刷新功能
實(shí)現(xiàn)上拉加載更多
打開項(xiàng)目根目錄中的pages.json配置文件,為subPackages分包中的商品goods_list頁(yè)面配置上拉觸底的距離:
"subPackages": [
{
"root": "subpkg",
"pages": [
{
"path": "goods_detail/goods_detail",
"style": {}
},
{
"path": "goods_list/goods_list",
"style": {
"onReachBottomDistance": 150
}
},
{
"path": "search/search",
"style": {}
}
]
}
]在goods_list頁(yè)面中,和methods節(jié)點(diǎn)平級(jí),聲明onReachBottom事件處理函數(shù),用來監(jiān)聽頁(yè)面的上拉觸底行為:
// 觸底的事件
onReachBottom() {
// 讓頁(yè)碼值自增 +1
this.queryObj.pagenum += 1
// 重新獲取列表數(shù)據(jù)
this.getGoodsList()
}改造methods中的getGoodsList函數(shù),當(dāng)列表數(shù)據(jù)請(qǐng)求成功之后,進(jìn)行新舊數(shù)據(jù)的拼接處理:
// 獲取商品列表數(shù)據(jù)的方法
async getGoodsList() {
// 發(fā)起請(qǐng)求
const { data: res } = await uni.$http.get('/api/public/v1/goods/search', this.queryObj)
if (res.meta.status !== 200) return uni.$showMsg()
// 為數(shù)據(jù)賦值:通過展開運(yùn)算符的形式,進(jìn)行新舊數(shù)據(jù)的拼接
this.goodsList = [...this.goodsList, ...res.message.goods]
this.total = res.message.total
}優(yōu)化
通過節(jié)流閥防止發(fā)起額外的請(qǐng)求
在 data 中定義isloading節(jié)流閥如下:
data() {
return {
// 是否正在請(qǐng)求數(shù)據(jù)
isloading: false
}
}修改getGoodsList方法,在請(qǐng)求數(shù)據(jù)前后,分別打開和關(guān)閉節(jié)流閥:
// 獲取商品列表數(shù)據(jù)的方法
async getGoodsList() {
// ** 打開節(jié)流閥
this.isloading = true
// 發(fā)起請(qǐng)求
const { data: res } = await uni.$http.get('/api/public/v1/goods/search', this.queryObj)
// ** 關(guān)閉節(jié)流閥
this.isloading = false
// 省略其它代碼...
}在onReachBottom觸底事件處理函數(shù)中,根據(jù)節(jié)流閥的狀態(tài),來決定是否發(fā)起請(qǐng)求:
// 觸底的事件
onReachBottom() {
// 判斷是否正在請(qǐng)求其它數(shù)據(jù),如果是,則不發(fā)起額外的請(qǐng)求
if (this.isloading) return
this.queryObj.pagenum += 1
this.getGoodsList()
}判斷數(shù)據(jù)是否加載完畢
如果下面的公式成立,則證明沒有下一頁(yè)數(shù)據(jù)了:
當(dāng)前的頁(yè)碼值 * 每頁(yè)顯示多少條數(shù)據(jù) >= 總數(shù)條數(shù)
pagenum * pagesize >= total
修改onReachBottom事件處理函數(shù)如下:
// 觸底的事件
onReachBottom() {
// 判斷是否還有下一頁(yè)數(shù)據(jù)
if (this.queryObj.pagenum * this.queryObj.pagesize >= this.total) return uni.$showMsg('數(shù)據(jù)加載完畢!')
// 判斷是否正在請(qǐng)求其它數(shù)據(jù),如果是,則不發(fā)起額外的請(qǐng)求
if (this.isloading) return
this.queryObj.pagenum += 1
this.getGoodsList()
}實(shí)現(xiàn)下拉刷新
在pages.json配置文件中,為當(dāng)前的goods_list頁(yè)面單獨(dú)開啟下拉刷新效果:
"subPackages": [{
"root": "subpkg",
"pages": [{
"path": "goods_detail/goods_detail",
"style": {}
}, {
"path": "goods_list/goods_list",
"style": {
"onReachBottomDistance": 150,
"enablePullDownRefresh": true,
"backgroundColor": "#F8F8F8"
}
}, {
"path": "search/search",
"style": {}
}]
}]監(jiān)聽頁(yè)面的onPullDownRefresh事件處理函數(shù):
// 下拉刷新的事件
onPullDownRefresh() {
// 1. 重置關(guān)鍵數(shù)據(jù)
this.queryObj.pagenum = 1
this.total = 0
this.isloading = false
this.goodsList = []
// 2. 重新發(fā)起請(qǐng)求
this.getGoodsList(() => uni.stopPullDownRefresh())
}修改getGoodsList函數(shù),接收cb回調(diào)函數(shù)并按需進(jìn)行調(diào)用:
// 獲取商品列表數(shù)據(jù)的方法
async getGoodsList(cb) {
this.isloading = true
const { data: res } = await uni.$http.get('/api/public/v1/goods/search', this.queryObj)
this.isloading = false
// 只要數(shù)據(jù)請(qǐng)求完畢,就立即按需調(diào)用 cb 回調(diào)函數(shù)
cb && cb()
if (res.meta.status !== 200) return uni.$showMsg()
this.goodsList = [...this.goodsList, ...res.message.goods]
this.total = res.message.total
}到此這篇關(guān)于Vue uni-app框架實(shí)現(xiàn)上拉加載下拉刷新功能的文章就介紹到這了,更多相關(guān)Vue uni-app內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue+px2rem實(shí)現(xiàn)pc端大屏自適應(yīng)的實(shí)例代碼(rem適配)
不管是移動(dòng)端的適配,還是大屏需求,都離不開不一個(gè)單位rem,rem是相對(duì)于根元素的字體大小的單位,下面這篇文章主要給大家介紹了關(guān)于vue+px2rem實(shí)現(xiàn)pc端大屏自適應(yīng)的相關(guān)資料,需要的朋友可以參考下2021-08-08
apache和nginx下vue頁(yè)面刷新404的解決方案
這篇文章主要介紹了apache和nginx下vue頁(yè)面刷新404的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
element的el-form-item的prop作用小結(jié)
Vue表單驗(yàn)證中的prop屬性用于指定需要驗(yàn)證的表單字段,它定義了字段名稱并與驗(yàn)證規(guī)則關(guān)聯(lián),確保數(shù)據(jù)的完整性和準(zhǔn)確性,本文就來介紹一下element的el-form-item的prop作用,感興趣的可以了解一下2025-01-01
vuex + axios 做登錄驗(yàn)證 并且保存登錄狀態(tài)的實(shí)例
今天小編就為大家分享一篇vuex + axios 做登錄驗(yàn)證 并且保存登錄狀態(tài)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09
vue如何判斷數(shù)組中的對(duì)象是否包含某個(gè)值
這篇文章主要介紹了vue如何判斷數(shù)組中的對(duì)象是否包含某個(gè)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
分享一個(gè)vue項(xiàng)目“腳手架”項(xiàng)目的實(shí)現(xiàn)步驟
這篇文章主要介紹了分享一個(gè)vue項(xiàng)目“腳手架”項(xiàng)目的實(shí)現(xiàn)步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05
如何在Vue3中使用視頻庫(kù)Video.js實(shí)現(xiàn)視頻播放功能
在Vue3項(xiàng)目中集成Video.js庫(kù),可以創(chuàng)建強(qiáng)大的視頻播放功能,這篇文章主要介紹了如何在Vue3中使用視頻庫(kù)Video.js實(shí)現(xiàn)視頻播放功能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09
Vue data的數(shù)據(jù)響應(yīng)式到底是如何實(shí)現(xiàn)的
這篇文章主要介紹了Vue data的數(shù)據(jù)響應(yīng)式到底是如何實(shí)現(xiàn)的,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
vue項(xiàng)目如何引入json數(shù)據(jù)
這篇文章主要介紹了vue項(xiàng)目如何引入json數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10

