vant-list上拉加載onload事件觸發(fā)多次問題及解決
vant-list上拉加載onload事件觸發(fā)多次
場(chǎng)景
3個(gè)tab頁(yè)簽切換時(shí),調(diào)用不同接口,在某一個(gè)tab只要翻頁(yè)到>=2的情況,當(dāng)它再點(diǎn)擊到另一個(gè)tab的時(shí)候,另外一個(gè)tab就會(huì)連續(xù)調(diào)用兩次查詢接口
(因?yàn)樗粌H觸發(fā)了created還觸發(fā)了onload事件:且順序?yàn)椋哼M(jìn)入created調(diào)用查詢接口,在.then之前,異步查詢還未返回的時(shí)候,又會(huì)去觸發(fā)onload事件,在current+=1之后再次進(jìn)行查詢)
知識(shí)點(diǎn)運(yùn)用:
一、基礎(chǔ)用法
List 組件通過 loading 和 finished 兩個(gè)變量控制加載狀態(tài),當(dāng)組件滾動(dòng)到底部時(shí),會(huì)觸發(fā) load事件并將 loading 設(shè)置成 true。
此時(shí)可以發(fā)起異步操作并更新數(shù)據(jù),數(shù)據(jù)更新完畢后,將 loading 設(shè)置成 false 即可。
若數(shù)據(jù)已全部加載完畢,則直接將 finished 設(shè)置成 true 即可。
二、List 的運(yùn)行機(jī)制是什么?
List 會(huì)監(jiān)聽瀏覽器的滾動(dòng)事件并計(jì)算列表的位置,當(dāng)列表底部與可視區(qū)域的距離小于offset時(shí),List會(huì)觸發(fā)一次 load 事件。
三、為什么 List 初始化后會(huì)立即觸發(fā) load 事件?
List 初始化后會(huì)觸發(fā)一次 load事件,用于加載第一屏的數(shù)據(jù),這個(gè)特性可以通過immediate-check屬性關(guān)閉。
四、為什么會(huì)連續(xù)觸發(fā) load 事件?
如果一次請(qǐng)求加載的數(shù)據(jù)條數(shù)較少,導(dǎo)致列表內(nèi)容無法鋪滿當(dāng)前屏幕,List 會(huì)繼續(xù)觸發(fā) load事件,直到內(nèi)容鋪滿屏幕或數(shù)據(jù)全部加載完成。
因此你需要調(diào)整每次獲取的數(shù)據(jù)條數(shù),理想情況下每次請(qǐng)求獲取的數(shù)據(jù)條數(shù)應(yīng)能夠填滿一屏高度。
五、loading 和 finished 分別是什么含義?
List有以下三種狀態(tài),理解這些狀態(tài)有助于你正確地使用List組件:
- 非加載中,loading為false,此時(shí)會(huì)根據(jù)列表滾動(dòng)位置判斷是否觸發(fā)load事件(列表內(nèi)容不足一屏幕時(shí),會(huì)直接觸發(fā))
- 加載中,loading為true,表示正在發(fā)送異步請(qǐng)求,此時(shí)不會(huì)觸發(fā)load事件
- 加載完成,finished為true,此時(shí)不會(huì)觸發(fā)load事件 在每次請(qǐng)求完畢后,需要手動(dòng)將loading設(shè)置為false,表示加載結(jié)束
這次遇到的問題,可以利用第五點(diǎn),解決方法:
在進(jìn)入created的發(fā)送請(qǐng)求之前,將this.loading = true , ⇒⇒⇒ (利用:加載中,loading為true,表示正在發(fā)送異步請(qǐng)求,此時(shí)不會(huì)觸發(fā)load事件),讓系統(tǒng)知道此時(shí)正在異步請(qǐng)求數(shù)據(jù),讓它別觸發(fā)onload事件
代碼:
<van-list
v-model="loading" class="van-list-style" :immediate-check="false"
:finished="finished" :finished-text="finishedText"
:error.sync="error" error-text="請(qǐng)求失敗,點(diǎn)擊重新加載"
@load="onLoad">
<div class="list" v-if="dataList.length > 0">
<div class="list-box2" v-for="(item,index) in dataList" :key="index" @click="handleClick(item)">
………………………………………
</div>
</div>
<div v-if="noData" style="margin-top:30%">
<img src="@/common/imgs/no-data.png" alt="" style="width:100%">
</div>
</van-list>
data() {
return {
dataList:[],
current:1,
size:10,
loading: false, // 上拉加載 ??????
finished: false, // 上拉加載完畢
error: false, // 是否展示錯(cuò)誤
finishedText:"沒有更多了",
noData:false, // 是否展示沒有數(shù)據(jù)的圖片
// offset: 100 // 滾動(dòng)條與底部距離小于 offset 時(shí)觸發(fā)load事件
}
},
created() {
// 調(diào)用列表查詢接口
this.init(this.tab)
},
methods:{
init(val) {
if(val === '1') {
this.createList(1,10)
}
},
//查詢接口
createList(current,size) {
let param = { current:current, size:size }
// 重點(diǎn)!?。。。。。。?!在這里將loading置為true
***this.loading = true;***
createList(param).then(res=>{
let that = this
if(res.status == true) {
//賦值
const dataList = res.body.records
const pages = res.body.pages
// 如果返回?cái)?shù)據(jù)為空
if(dataList == null || dataList.length === 0) {
that.finished = true
that.finishedText = "沒發(fā)現(xiàn)任何東西,去其他地方逛逛吧~"
that.noData = true
return
}
// 加載狀態(tài)結(jié)束 可以寫在這里也可以寫在finally里面
that.loading = false;
// 根據(jù)當(dāng)前頁(yè)進(jìn)行數(shù)據(jù)處理
if(that.current === 1) {
that.dataList = dataList
} else {
that.dataList = that.dataList.concat(dataList)
}
// xxx?。。∽詈笠豁?yè)不足10條的情況 ,這樣寫實(shí)際有問題,因?yàn)槿绻亲詈笠豁?yè)為10條的情況,就會(huì)第二次去調(diào)用接口
//if(dataList.length < that.size) {
// that.finished = true
//that.finishedText = '沒有更多了';
//}
// 使用這種??! 證明已經(jīng)是最后一頁(yè)了
if(that.current = pages) {
that.finished = true
that.finishedText = '沒有更多了';
}
}
})
.catch(err=>{this.error = true; })
.finally(()=>{this.loading = false })
},
// 上拉刷新
onLoad() {
this.current+=1
this.createList(this.current,this.size)
},
}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue的transition-group與Virtual Dom Diff算法的使用
這篇文章主要介紹了Vue的transition-group與Virtual Dom Diff算法的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
vue 中基于html5 drag drap的拖放效果案例分析
本文通過三個(gè)案例給大家介紹了vue 中基于html5 drag drap的拖放效果 ,需要的朋友可以參考下2018-11-11
vue用vis插件如何實(shí)現(xiàn)網(wǎng)絡(luò)拓?fù)鋱D
這篇文章主要介紹了vue用vis插件如何實(shí)現(xiàn)網(wǎng)絡(luò)拓?fù)鋱D,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
單頁(yè)面vue引入百度統(tǒng)計(jì)的使用方法示例詳解
在網(wǎng)上各種找不到vue項(xiàng)目加入百度統(tǒng)計(jì)的代碼與實(shí)現(xiàn),自己探索出了一套加入百度統(tǒng)計(jì)的辦法,下面這篇文章主要給大家介紹了關(guān)于單頁(yè)面vue引入百度統(tǒng)計(jì)的使用方法,需要的朋友可以參考下2018-10-10
vue 運(yùn)用mock數(shù)據(jù)的示例代碼
本篇文章主要介紹了vue 運(yùn)用mock數(shù)據(jù)的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
VUE2 前端實(shí)現(xiàn) 靜態(tài)二級(jí)省市聯(lián)動(dòng)選擇select的示例
下面小編就為大家分享一篇VUE2 前端實(shí)現(xiàn) 靜態(tài)二級(jí)省市聯(lián)動(dòng)選擇select的示例。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02
親自動(dòng)手實(shí)現(xiàn)vue日歷控件
這篇文章主要記錄了親自動(dòng)手實(shí)現(xiàn)vue日歷控件的詳細(xì)過程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
Vue實(shí)現(xiàn)table列表項(xiàng)上下移動(dòng)的示例代碼
本文主要介紹了Vue實(shí)現(xiàn)table列表項(xiàng)上下移動(dòng)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04

