Vue異步請求數(shù)據(jù)和nextTick

vue異步獲取數(shù)據(jù)解析

最近在用vue重構(gòu)有贊商城,在異步獲取數(shù)據(jù)的時候有些困惑,所以總結(jié)分享給大家泞遗,也希望大家能夠一起進步效扫。

場景顯示: 我們現(xiàn)在需要做一個輪播組件倔监,我們需要接收父組件傳遞過來的圖片數(shù)組(lists),所以父組件需要請求后端接口菌仁,從而獲取數(shù)組列表浩习。

1. 數(shù)據(jù)變化

數(shù)據(jù)流程.png

數(shù)據(jù)的到來分幾步階段 list: null

  1. 通過接口異步請求數(shù)據(jù) loading狀態(tài)
  2. 獲取回來的數(shù)據(jù):
    • 有數(shù)據(jù) 渲染 list&&list.length > 0
    • 無數(shù)據(jù) 空狀態(tài)的提示 list&&list.length = 0

父組件初始化要獲取的lists數(shù)組

// 父組件
data(){
  return {
    lists : null
  }
},
created() {
  this.getBanner()
}
methods: {
  getBanner() {
     // 獲取數(shù)據(jù)
    axios.get(url.banner).then((res) => {
      this.lists = res.data.lists || [];   
    }) 
  }
}

2. 子組件接收數(shù)據(jù)的過程

子組件接收父組件的數(shù)據(jù)

  1. 當(dāng)異步請求還沒有得到數(shù)據(jù)的時候济丘,得到lists = null
  2. 當(dāng)異步請求得到數(shù)據(jù)后谱秽,通過props,才能夠得到真正的數(shù)據(jù) 。

這里就有一個問題了

  1. 父組件剛開始傳遞的數(shù)據(jù)是null給子組件摹迷,但是子組件期望得到的是一個數(shù)組
父組件傳遞null.png

解決方案: 當(dāng)list=null的時候不渲染子組件疟赊,當(dāng)數(shù)據(jù)到來的時候再進行渲染子組件

// 數(shù)據(jù)到來的時候渲染子組件 
<swiper :lists= bannerLists name="swiper-banner" v-if="bannerLists"></swiper>
// 數(shù)組沒有到來的時候loading
<div v-else>loading</div>

子組件的代碼:

props: {
    lists: {
      type: Array,
      required: true
    },
    // lists: {},
    name: {}
  },
  // swiper必須要依賴dom
  mounted() {
    this.init();
  },
  methods: {
    init() {
      new Swiper('.swiper-container',{
        loop: true,
        pagination: '.swiper-pagination',
        autoplay: 2000
     })
    }
  },

解決方案: 如果我們不通過v-if來判定子組件是否渲染,而是通過子組件的生命周期函數(shù)進行處理

  props: {
    //lists: {
      //type: Array,
      //required: true
    //},
    lists: {},  //不能限定type峡碉,接收剛開始的null,和之后的數(shù)組lists
    name: {}
  },
  // swiper必須要依賴dom
  methods: {
    init() {
      new Swiper('.swiper-container',{
        loop: true,
        pagination: '.swiper-pagination',
        autoplay: 2000
     })
    }
  },
  watch: {
    //監(jiān)聽lists的變化(從null => 數(shù)組)
    lists(val,oldVal) {
      this.nextTick(() => {
        this.init()  //當(dāng)數(shù)據(jù)到來的時候近哟, DOM 更新循環(huán)結(jié)束之后,立即執(zhí)行函數(shù)
      })
    }
  }  

解析: 這里為什么需要使用this.nextTick()呢异赫?當(dāng)我們監(jiān)聽到lists發(fā)生變化的時候椅挣,數(shù)據(jù)雖然到來了,但是通過數(shù)據(jù)渲染到的對應(yīng)dom還沒有執(zhí)行塔拳,我們還不能獲取到對應(yīng)的dom鼠证,只能通過異步的方式處理(this.nextTick())

<template>
  <div class="swiper-container">
      <div class="swiper-wrapper">
        <div class="swp-page swiper-slide" v-for="list in lists">
          <a class="js-no-follow" :href="list.clickUrl">
            ![](list.image)
          </a>
        </div>
      </div>
      <div class="swiper-pagination"></div>
  </div>
</template>
<script>
  watch: {
    lists(val,oldval){
      console.log(document.querySelector('.swiper-container'))  //可以獲取
      console.log(`val++++${val}`);
      console.log(document.querySelectorAll('.swiper-slide')) //不能獲取
      this.$nextTick(() => {
        if(val){
          this.init();
        }
        console.log(document.querySelectorAll('.swiper-slide')) //可以獲取
      })
    }
  }
</script>

要確定dom已經(jīng)渲染完畢,如果有初始數(shù)據(jù)靠抑,在mounted這個階段dom已經(jīng)渲染完畢量九。如果通過watch來監(jiān)聽數(shù)據(jù)的變化,數(shù)據(jù)變化后不是馬上渲染dom的,是等到下次事件隊列來處理的荠列,就需要用到nextTick类浪。

? 關(guān)于nextTick可以查看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肌似,隨后出現(xiàn)的幾起案子费就,更是在濱河造成了極大的恐慌,老刑警劉巖川队,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件力细,死亡現(xiàn)場離奇詭異,居然都是意外死亡固额,警方通過查閱死者的電腦和手機眠蚂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斗躏,“玉大人逝慧,你說我怎么就攤上這事∽牟冢” “怎么了笛臣?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長迈套。 經(jīng)常有香客問我捐祠,道長,這世上最難降的妖魔是什么桑李? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任踱蛀,我火速辦了婚禮,結(jié)果婚禮上贵白,老公的妹妹穿的比我還像新娘率拒。我一直安慰自己,他們只是感情好禁荒,可當(dāng)我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布猬膨。 她就那樣靜靜地躺著,像睡著了一般呛伴。 火紅的嫁衣襯著肌膚如雪勃痴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天热康,我揣著相機與錄音沛申,去河邊找鬼。 笑死姐军,一個胖子當(dāng)著我的面吹牛铁材,可吹牛的內(nèi)容都是我干的尖淘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼著觉,長吁一口氣:“原來是場噩夢啊……” “哼村生!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饼丘,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤趁桃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后葬毫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镇辉,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年贴捡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片村砂。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡烂斋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出础废,到底是詐尸還是另有隱情汛骂,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布评腺,位于F島的核電站帘瞭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蒿讥。R本人自食惡果不足惜蝶念,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芋绸。 院中可真熱鬧媒殉,春花似錦、人聲如沸摔敛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽马昙。三九已至桃犬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間行楞,已是汗流浹背攒暇。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留敢伸,地道東北人扯饶。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尾序。 傳聞我的和親對象是個殘疾皇子钓丰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對于 Vue 1.0 印象不深的內(nèi)容每币。關(guān)于...
    云之外閱讀 5,052評論 0 29
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,275評論 25 707
  • 1.安裝 可以簡單地在頁面引入Vue.js作為獨立版本携丁,Vue即被注冊為全局變量,可以在頁面使用了兰怠。 如果希望搭建...
    Awey閱讀 11,034評論 4 129
  • Vue筆記系列1梦鉴、Vue.js入門3、Vue.js進階 API 以下會隨用隨記一些API揭保,可能會不定期更新肥橙。 Vu...
    其心閱讀 2,070評論 0 10
  • 用于執(zhí)行自定義動畫,通過CSS樣式秸侣,將一個狀態(tài)改變?yōu)榱硪粋€狀態(tài) 例如: 注:(1)只有數(shù)字屬性值可以創(chuàng)建動畫(2)...
    何幻閱讀 246評論 0 0