最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vant-list組件觸發(fā)多次onload事件導(dǎo)致數(shù)據(jù)亂序的解決方案

 更新時(shí)間:2023年01月20日 08:49:06   作者:huangzhin  
這篇文章主要介紹了vant-list組件觸發(fā)多次onload事件導(dǎo)致數(shù)據(jù)亂序的解決方案

1、問題描述

3個(gè)tab頁簽切換時(shí),調(diào)用不同接口,在某一個(gè)tab只要翻頁到>=2的情況,當(dāng)它再點(diǎn)擊到另一個(gè)tab的時(shí)候,另外一個(gè)tab就會(huì)連續(xù)調(diào)用兩次查詢接口,有可能第二次查詢的數(shù)據(jù)先于第一次查詢返回,這時(shí)兩次數(shù)據(jù)concat后順序就不對(duì)了(第二次查到的數(shù)據(jù)在前,第一次在后)

原因分析

因?yàn)樗粌H觸發(fā)了created還觸發(fā)了onload事件:且順序?yàn)椋哼M(jìn)入created調(diào)用查詢接口,在.then之前,異步查詢還未返回的時(shí)候,又會(huì)去觸發(fā)onload事件,在current+=1之后再次進(jìn)行查詢

2、先了解一下相關(guān)知識(shí)點(diǎn)

1)基礎(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 即可。

2)List 的運(yùn)行機(jī)制是什么?

List 會(huì)監(jiān)聽瀏覽器的滾動(dòng)事件并計(jì)算列表的位置,當(dāng)列表底部與可視區(qū)域的距離小于offset時(shí),List會(huì)觸發(fā)一次 load 事件。

3)為什么 List 初始化后會(huì)立即觸發(fā) load 事件?

List 初始化后會(huì)觸發(fā)一次 load事件,用于加載第一屏的數(shù)據(jù),這個(gè)特性可以通過immediate-check屬性關(guān)閉。

4)為什么會(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)能夠填滿一屏高度。

5)loading 和 finished 分別是什么含義?

List有以下三種狀態(tài),理解這些狀態(tài)有助于你正確地使用List組件:

  • 非加載中,loading為false,此時(shí)會(huì)根據(jù)列表滾動(dòng)位置判斷是否觸發(fā)onload事件(列表內(nèi)容不足一屏幕時(shí),會(huì)直接觸發(fā))
  • 加載中,loading為true,表示正在發(fā)送異步請(qǐng)求,此時(shí)不會(huì)觸發(fā)onload事件
  • 加載完成,finished為true,此時(shí)不會(huì)觸發(fā)onload事件 在每次請(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事件

3、代碼

<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)前頁進(jìn)行數(shù)據(jù)處理
      if(that.current === 1) {
        that.dataList = dataList
      } else {
        that.dataList = that.dataList.concat(dataList)
      }
 
      // xxx?。?!最后一頁不足10條的情況 ,這樣寫實(shí)際有問題,因?yàn)槿绻亲詈笠豁摓?0條的情況,就會(huì)第二次去調(diào)用接口
      //if(dataList.length < that.size) {
       // that.finished = true
       //that.finishedText = '沒有更多了';
      //}
 
      // 使用這種?。?證明已經(jīng)是最后一頁了
      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中sync語法糖的用法詳解

    vue中sync語法糖的用法詳解

    Vue的.sync語法糖是一個(gè)用于雙向數(shù)據(jù)綁定的指令,可以在子組件中用來監(jiān)聽父組件傳遞下來的props的變化,本文給大家介紹了在Vue中,.sync語法糖的使用方法,感興趣的朋友跟著小編一起來學(xué)習(xí)吧
    2024-01-01
  • vue+elementUi實(shí)現(xiàn)點(diǎn)擊地圖自動(dòng)填充經(jīng)緯度以及地點(diǎn)

    vue+elementUi實(shí)現(xiàn)點(diǎn)擊地圖自動(dòng)填充經(jīng)緯度以及地點(diǎn)

    這篇文章主要為大家詳細(xì)介紹了vue+elementUi實(shí)現(xiàn)點(diǎn)擊地圖自動(dòng)填充經(jīng)緯度以及地點(diǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 解決vue 打包發(fā)布去#和頁面空白的問題

    解決vue 打包發(fā)布去#和頁面空白的問題

    今天小編就為大家分享一篇解決vue 打包發(fā)布去#和頁面空白的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue項(xiàng)目如何引入element?ui、iview和echarts

    vue項(xiàng)目如何引入element?ui、iview和echarts

    這篇文章主要介紹了vue項(xiàng)目如何引入element?ui、iview和echarts,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue2結(jié)合echarts實(shí)現(xiàn)一個(gè)地圖的效果

    vue2結(jié)合echarts實(shí)現(xiàn)一個(gè)地圖的效果

    這篇文章主要介紹了vue2結(jié)合echarts實(shí)現(xiàn)一個(gè)地圖的效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家何用vue和echarts實(shí)現(xiàn)一個(gè)地圖有一定的幫助,感興趣的朋友一起看看吧
    2024-03-03
  • vue使用assign巧妙重置data數(shù)據(jù)方式

    vue使用assign巧妙重置data數(shù)據(jù)方式

    這篇文章主要介紹了vue使用assign巧妙重置data數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • vue3 element-plus如何使用icon圖標(biāo)組件

    vue3 element-plus如何使用icon圖標(biāo)組件

    這篇文章主要介紹了vue3 element-plus如何使用icon圖標(biāo)組件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue面試??贾甤omputed是如何實(shí)現(xiàn)的

    vue面試常考之computed是如何實(shí)現(xiàn)的

    對(duì)于每天都在用的計(jì)算屬性(computed),小編猜大家肯定也想窺探其奧妙與原理對(duì)吧,所以這篇文章就來講講computed是如何實(shí)現(xiàn)的吧,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-08-08
  • vue3?ref獲取組件實(shí)例詳細(xì)圖文教程

    vue3?ref獲取組件實(shí)例詳細(xì)圖文教程

    在Vue3中可以使用ref函數(shù)來創(chuàng)建一個(gè)響應(yīng)式的變量,通過將ref函數(shù)應(yīng)用于一個(gè)組件實(shí)例,我們可以獲取到該組件的實(shí)例對(duì)象,這篇文章主要給大家介紹了關(guān)于vue3?ref獲取組件實(shí)例的詳細(xì)圖文教程,需要的朋友可以參考下
    2023-10-10
  • VUE簽字組件vue-esign安裝使用教程

    VUE簽字組件vue-esign安裝使用教程

    在我們開發(fā)項(xiàng)目中,特別是流程審批類的項(xiàng)目,最后一步會(huì)提交審核,審核員看完相應(yīng)信息以后,沒問題就會(huì)簽字通過審批,這篇文章主要給大家介紹了關(guān)于VUE簽字組件vue-esign安裝使用的相關(guān)資料,需要的朋友可以參考下
    2023-09-09

最新評(píng)論

南安市| 武强县| 留坝县| 肥西县| 关岭| 盐山县| 海阳市| 大化| 侯马市| 信宜市| 丽江市| 通江县| 加查县| 同仁县| 永靖县| 阳朔县| 剑阁县| 文成县| 莫力| 祥云县| 永寿县| 南木林县| 金川县| 德兴市| 双鸭山市| 元氏县| 南部县| 桑植县| 新巴尔虎右旗| 古丈县| 正镶白旗| 介休市| 临清市| 汝阳县| 白银市| 大港区| 上思县| 南投市| 宁海县| 南岸区| 武安市|