關(guān)于scroll-view組件的下拉刷新其障,無論是uni-app還是微信小程序,官方都說得不是很明白涂佃,有一個(gè)非常關(guān)鍵的關(guān)鍵規(guī)則沒說清楚励翼,組件屬性例子:
refresher-triggered="triggered" @refresherrefresh="onRefresh" @refresherrestore="onRestore" scrolltolower="loadMore"
1.通過程序?qū)riggered設(shè)為true時(shí),將觸發(fā)onRefresh巡李;
2.不管triggered為何值抚笔,在界面中下拉扶认,也會(huì)觸發(fā)onRefresh侨拦,但不會(huì)自動(dòng)改變triggered值(不能雙向綁定,這是問題的根本原因)辐宾;
3.onRefresh執(zhí)行完畢狱从,不會(huì)自動(dòng)觸發(fā)onRestore(這是問題的表現(xiàn)),使得刷新圖標(biāo)一直顯示叠纹,必須是triggered由true變?yōu)閒alse季研,才會(huì)觸發(fā)onRestore并隱藏刷新圖標(biāo);如果triggered一直為false誉察,或一直為true与涡,都不會(huì)觸發(fā)。
解決辦法:
1.在進(jìn)入onRefresh后持偏,如果triggered為false驼卖,則將它置為true,當(dāng)執(zhí)行完你的刷新操作(通常是獲取新的數(shù)據(jù))后鸿秆,將triggered置為false酌畜。
2.由于上一步中將triggered置為true,會(huì)再次觸發(fā)onRefresh卿叽,故需再增加一個(gè)_freshing桥胞,表示是否正在執(zhí)行刷新操作,在onRefresh中做判斷考婴,如_freshing為true贩虾,不執(zhí)行刷新操作直接返回。
如果scroll-view有多個(gè)沥阱,要每個(gè)用自己的 triggered和refreshing來控制整胃。
代碼如下,和官方差不多,注意有關(guān)鍵的幾個(gè)細(xì)節(jié)不同屁使。
<script>
export default {
data() {
return {
triggered: false在岂,
_freshing: false
}
},
onLoad() {
this._freshing = false;
setTimeout(() => {
this.triggered = true;//觸發(fā)onRefresh來加載自己的數(shù)據(jù),如果不用這種方式蛮寂,不要在此改變triggered的值
}, 1000)
},
methods: {
onPulling(e) {
console.log(e);
},
onRefresh() {
if (this._freshing) return;
this._freshing = true;
if (!this.triggered)//界面下拉觸發(fā)蔽午,triggered可能不是true,要設(shè)為true
this.triggered = true;
setTimeout(() => {
this.triggered = false;//觸發(fā)onRestore酬蹋,并關(guān)閉刷新圖標(biāo)
this._freshing = false;
}, 3000)
},
onRestore() {
console.log(1);
},
onAbort() {
console.log(1);
}
}
}
</script>