Vue生命周期與Vue.nextTick()

實例生命周期:

https://segmentfault.com/a/1190000008570622.jpg

image.png

  • beforeCreate:在實例初始化之后脚囊,數(shù)據(jù)觀測data observer(props、data芦拿、computed) 和 event/watcher 事件配置之前被調用士飒。
  • created:實例已經創(chuàng)建完成之后被調用。在這一步蔗崎,實例已完成以下的配置:數(shù)據(jù)觀測(data observer)酵幕,屬性和方法的運算, watch/event 事件回調缓苛。然而芳撒,掛載階段還沒開始,$el 屬性目前不可見未桥。
  • beforeMount:在掛載開始之前被調用:相關的 render 函數(shù)首次被調用番官。
  • mounted: el 被新創(chuàng)建的 vm.$el 替換,并掛載到實例上去之后調用該鉤子钢属。
  • beforeUpdate:數(shù)據(jù)更新時調用,發(fā)生在虛擬 DOM 重新渲染和打補丁之前门躯。 你可以在這個鉤子中進一步地更改狀態(tài)淆党,這不會觸發(fā)附加的重渲染過程。
  • updated:無論是組件本身的數(shù)據(jù)變更,還是從父組件接收到的 props 或者從vuex里面拿到的數(shù)據(jù)有變更染乌,都會觸發(fā)虛擬 DOM 重新渲染和打補丁山孔,并在之后調用 updated
  • beforeDestroy:實例銷毀之前調用荷憋。在這一步台颠,實例仍然完全可用。
  • destroyed:Vue 實例銷毀后調用勒庄。調用后串前,Vue 實例指示的所有東西都會解綁定,所有的事件監(jiān)聽器會被移除实蔽,所有的子實例也會被銷毀荡碾。 該鉤子在服務器端渲染期間不被調用。

注意:
created階段的ajax請求與mounted請求的區(qū)別:前者頁面視圖未出現(xiàn)局装,如果請求信息過多坛吁,頁面會長時間處于白屏狀態(tài)。

單個組件的生命周期

  1. 初始化組件時铐尚,僅執(zhí)行了beforeCreate/Created/beforeMount/mounted四個鉤子函數(shù)
  2. 當改變data中定義的變量(響應式變量)時拨脉,會執(zhí)行beforeUpdate/updated鉤子函數(shù)
  3. 當切換組件(當前組件未緩存)時,會執(zhí)行beforeDestory/destroyed鉤子函數(shù)
  4. 初始化和銷毀時的生命鉤子函數(shù)均只會執(zhí)行一次宣增,beforeUpdate/updated可多次執(zhí)行

Vue.nextTick():

在下次 DOM 更新循環(huán)結束之后執(zhí)行延遲回調玫膀。在修改數(shù)據(jù)之后立即使用這個方法,獲取更新后的 DOM统舀。

獲取更新后的DOM言外之意就是什么操作需要用到了更新后的DOM而不能使用之前的DOM或者使用更新前的DOM會出問題匆骗,所以就衍生出了這個獲取更新后的 DOMVue方法。所以放在Vue.nextTick()回調函數(shù)中的執(zhí)行的應該是會對DOM進行操作的 js代碼誉简,比如Swiper擴展包的:

var swiper = new Swiper('.swiper-container', {
                    pagination: '.swiper-pagination',
                    nextButton: '.swiper-button-next',
                    prevButton: '.swiper-button-prev',
                    paginationClickable: true,
                    spaceBetween: 30,
                    centeredSlides: true,
                    autoplay: 2500,
                    autoplayDisableOnInteraction: false
});

什么時候需要用Vue.nextTick():

  • 你在Vue生命周期的created()鉤子函數(shù)進行的DOM操作一定要放在Vue.nextTick()的回調函數(shù)中碉就。原因是什么呢,原因是在created()鉤子函數(shù)執(zhí)行的時候DOM 其實并未進行任何渲染闷串,而此時進行DOM操作無異于徒勞瓮钥,所以此處一定要將DOM操作的js代碼放進Vue.nextTick()的回調函數(shù)中。與之對應的就是mounted鉤子函數(shù)烹吵,因為該鉤子函數(shù)執(zhí)行時所有的DOM掛載和渲染都已完成碉熄,此時在該鉤子函數(shù)中進行任何DOM操作都不會有問題 。
  • 在數(shù)據(jù)變化后要執(zhí)行的某個操作肋拔,當你設置 vm.someData = 'new value'锈津,DOM并不會馬上更新,而是在異步隊列被清除凉蜂,也就是下一個事件循環(huán)開始時執(zhí)行更新時才會進行必要的DOM更新琼梆。如果此時你想要根據(jù)更新的 DOM 狀態(tài)去做某些事情性誉,就會出現(xiàn)問題。茎杂。為了在數(shù)據(jù)變化之后等待 Vue 完成更新 DOM 错览,可以在數(shù)據(jù)變化之后立即使用 Vue.nextTick(callback) 。這樣回調函數(shù)在 DOM 更新完成后就會調用煌往。
  • mounted 不會承諾所有的子組件也都一起被掛載倾哺。如果你希望等到整個視圖都渲染完畢,可以用 vm.$nextTick 替換掉 mounted
mounted: function () {
this.$nextTick(function () {

// Code that will run only after the
// entire view has been rendered
})
}

2021.9.7補充:為什么nextTick里的代碼會在DOM更新后執(zhí)行
先看一段代碼:

this.$nextTick(() => {
  console.log('獲取最新dom1:', this.$refs.con) // 1
  // debugger
})
this.value++  // 2 這里實際上會執(zhí)行 watcher.run()
this.$nextTick(() => {
  console.log('獲取最新dom2:', this.$refs.con)  // 3
  // debugger
})

打印結果如下:


但是如果把this.value++和第一個nextTick調換位置刽脖,兩個nextTick都能獲取到最新的dom了羞海。是什么原因,我們來從vue的源碼分析一下:
this.value++ -> 觸發(fā)set函數(shù) -> 通知依賴更新: dep.notify() -> 調用 watcher.update() -> watcher.run()放在vue的nextTick函數(shù)中執(zhí)行 -> flushCallbacks調用隊列中的所有cb曾棕,執(zhí)行順序為1扣猫、2、3 -> 執(zhí)行到2的時候調用_render 翘地、_update申尤、patch更新dom
所以執(zhí)行到1的時候dom是沒有進行更新的,因此打印的也是沒有更新的dom衙耕,執(zhí)行到2的時候已經完成了patch昧穿,dom更新了,因此拿到的是新的dom橙喘。
這個流程走完后时鸵,vue替換掉了老的dom節(jié)點,這時候dom樹已經是新的了厅瞎,所以在JS中獲取dom數(shù)據(jù)也是新的饰潜,但是視圖不一定更新了,因為不一定完成了繪制(這個正確性還有待考證)和簸。

參考文章:
https://mp.weixin.qq.com/s/4ukhHAcMQN07y0ssYqUeuA
https://segmentfault.com/a/1190000008570622
https://segmentfault.com/a/1190000008570874

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末彭雾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锁保,更是在濱河造成了極大的恐慌薯酝,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爽柒,死亡現(xiàn)場離奇詭異吴菠,居然都是意外死亡,警方通過查閱死者的電腦和手機浩村,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門做葵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人心墅,你說我怎么就攤上這事蜂挪≈靥簦” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵棠涮,是天一觀的道長。 經常有香客問我刺覆,道長严肪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任谦屑,我火速辦了婚禮驳糯,結果婚禮上,老公的妹妹穿的比我還像新娘氢橙。我一直安慰自己酝枢,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布悍手。 她就那樣靜靜地躺著帘睦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坦康。 梳的紋絲不亂的頭發(fā)上竣付,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音滞欠,去河邊找鬼古胆。 笑死,一個胖子當著我的面吹牛筛璧,可吹牛的內容都是我干的逸绎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼夭谤,長吁一口氣:“原來是場噩夢啊……” “哼棺牧!你這毒婦竟也來了?” 一聲冷哼從身側響起沮翔,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤陨帆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后采蚀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疲牵,經...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年榆鼠,在試婚紗的時候發(fā)現(xiàn)自己被綠了纲爸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡妆够,死狀恐怖识啦,靈堂內的尸體忽然破棺而出负蚊,到底是詐尸還是另有隱情,我是刑警寧澤颓哮,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布家妆,位于F島的核電站,受9級特大地震影響冕茅,放射性物質發(fā)生泄漏伤极。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一姨伤、第九天 我趴在偏房一處隱蔽的房頂上張望哨坪。 院中可真熱鬧,春花似錦乍楚、人聲如沸当编。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忿偷。三九已至,卻和暖如春词渤,著一層夾襖步出監(jiān)牢的瞬間牵舱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工缺虐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芜壁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓高氮,卻偏偏與公主長得像慧妄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子剪芍,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容