理解vue實例的生命周期和鉤子函數(shù)

雖然經(jīng)常使用mounted俺抽、created等幾個鉤子函數(shù)敞映,但是并沒有很系統(tǒng)的將它和生命周期關(guān)聯(lián)一起去理解,這導(dǎo)致我在最近項目里踩了坑磷斧。所以現(xiàn)在花點時間振愿,整理一下這方面的知識。

我的其他文章弛饭,也可以了解一下:
【使用vue-cli(vue腳手架)快速搭建項目】:http://www.reibang.com/p/1ee1c410dc67
【vue之父子組件間通信實例講解(props冕末、ref 、emit )】:
http://www.reibang.com/p/91416e11f012
【vue之將echart封裝為組件】:
http://www.reibang.com/p/ec39019e2141

1. vue實例的生命周期

通俗來說 vue的生命周期就是vue實例從創(chuàng)建到銷毀的過程侣颂,我將這個過程中的一些關(guān)鍵點抽取出來档桃,簡化為下面這個流程圖:


生命周期

2. 結(jié)合生命周期理解鉤子函數(shù)

vue2.0提供了一系列鉤子函數(shù),這些函數(shù)和生命周期的各個階段一一對應(yīng):


生命周期和鉤子函數(shù)
鉤子函數(shù) 描述
beforeCreate 在實例初始化之后憔晒,數(shù)據(jù)觀測(data observer)
和 event/watch事件配置之前被調(diào)用
created 在實例創(chuàng)建完成后立即被調(diào)用藻肄,在這一步實例已經(jīng)完成了:
數(shù)據(jù)觀測、屬性和方法的運算和 event/watch事件的回調(diào)拒担,
但是$el屬性目前不可見嘹屯。
beforeMount 在掛載開始之前被調(diào)用
mounted 在掛載成功后被調(diào)用,el被新創(chuàng)建的vm.$el替換
beforeUpdate 數(shù)據(jù)更新之前調(diào)用
update 數(shù)據(jù)更新完成時調(diào)用从撼,組件dom已經(jīng)更新
activated 組件被激活時調(diào)用
deactivated 組件被移除時調(diào)用
beforeDestory 組件銷毀前調(diào)用
destoryed 組件銷毀后調(diào)用

3. 結(jié)合代碼理解鉤子函數(shù)

為了更深入的理解各個鉤子函數(shù)的區(qū)別州弟,我們結(jié)合代碼去看看:

<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>
<script type="text/javascript">
  export default {
    data(){
      return{
        message : "鉤子函數(shù)小測試"
      }
    },
    beforeCreate(){
      console.group('beforeCreate 創(chuàng)建前狀態(tài) ------------>');
      console.log("%c%s", "color:red" , "el     : " + this.$el); //undefined
      console.log("%c%s", "color:red","data   : " + this.$data); //undefined
      console.log("%c%s", "color:red","message: " + this.message)
    },
    created() {
      console.group('created 創(chuàng)建完畢狀態(tài) ------------>');
      console.log("%c%s", "color:red","el     : " + this.$el); //undefined
      console.log("%c%s", "color:red","data   : " + this.$data); //已被初始化
      console.log("%c%s", "color:red","message: " + this.message); //已被初始化
    },
    beforeMount() {
      console.group('beforeMount 掛載前狀態(tài) ------------>');
      console.log("%c%s", "color:red","el     : " + (this.$el)); //已被初始化
      console.log("%c%s", "color:red","data   : " + this.$data); //已被初始化
      console.log("%c%s", "color:red","message: " + this.message); //已被初始化
    },
    mounted() {
      console.group('mounted 掛載結(jié)束狀態(tài) ------------>');
      console.log("%c%s", "color:red","el     : " + this.$el); //已被初始化
      console.log(this.$el);
      console.log("%c%s", "color:red","data   : " + this.$data); //已被初始化
      console.log("%c%s", "color:red","message: " + this.message); //已被初始化
    },
    beforeUpdate() {
      console.group('beforeUpdate 更新前狀態(tài) ------------>');
      console.log("%c%s", "color:red","el     : " + this.$el);
      console.log(this.$el);
      console.log('真實dom結(jié)構(gòu):' + document.getElementById('app').innerHTML);
      console.log("%c%s", "color:red","data   : " + this.$data);
      console.log("%c%s", "color:red","message: " + this.message);
    },
    updated() {
      console.group('updated 更新完成狀態(tài) ------------>');
      console.log("%c%s", "color:red","el     : " + this.$el);
      console.log(this.$el);
      console.log('真實dom結(jié)構(gòu):' + document.getElementById('app').innerHTML);
      console.log("%c%s", "color:red","data   : " + this.$data);
      console.log("%c%s", "color:red","message: " + this.message);
    },
    beforeDestroy() {
      console.group('beforeDestroy 銷毀前狀態(tài) ------------>');
      console.log("%c%s", "color:red","el     : " + this.$el);
      console.log(this.$el);
      console.log("%c%s", "color:red","data   : " + this.$data);
      console.log("%c%s", "color:red","message: " + this.message);
    },
    destroyed() {
      console.group('destroyed 銷毀完成狀態(tài) ------------>');
      console.log("%c%s", "color:red","el     : " + this.$el);
      console.log(this.$el);
      console.log("%c%s", "color:red","data   : " + this.$data);
      console.log("%c%s", "color:red","message: " + this.message)
    }
  }
</script>
(1)創(chuàng)建階段

創(chuàng)建的標(biāo)志點是New vue(),beforeCreate和created都發(fā)生在創(chuàng)建動作之后低零,但區(qū)別在于
beforeCreate觸發(fā)的時候數(shù)據(jù)還沒初始化和綁定呆馁,而created的時候就生成好了,具體我們看看console的內(nèi)容:

創(chuàng)建階段

數(shù)據(jù)很明顯了毁兆,beforeCreate觸發(fā)的時el浙滤、data都沒初始化,但到created的時候雖然el依然沒有初始化气堕,但是data已經(jīng)生成了纺腊,并且成功將message的值綁定上畔咧。

(2)掛載階段

beforeMount和mounted兩者主要區(qū)別在于模板是否編譯和掛載了。


掛載階段

el是用來告訴實例在那個元素上進(jìn)行掛載的揖膜,我們可以看到beforeMount觸發(fā)的時候el還是沒有初始化誓沸,而到mounted的時候已經(jīng)找到要掛載的元素,并且將模板編譯了壹粟。

(3)更新階段

加載頁面的時候拜隧,其實到mounted這里就結(jié)束了,更新和銷毀并不會觸發(fā)到趁仙。
這里我另外寫了一個方法去改變message的值洪添,觸發(fā)更新:

 methods:{
      change(){
        this.message = '不如更新一下咯'
      }
    },

控制臺的結(jié)果:


更新階段

我們可以看到,當(dāng)我們?nèi)ジ淖僲essage的值的時候雀费,觸發(fā)了beforeUpdate函數(shù)干奢,這個時候$el的值已經(jīng)更改了,但是dom并沒有變動盏袄。到update的時候忿峻,才真正去更新dom結(jié)構(gòu)。

(4)銷毀階段

再寫一個方法來觸發(fā)銷毀:

 methods:{
      destroy(){
        this.$destroy()
      }
    },

控制臺的結(jié)果:


image.png

可以發(fā)現(xiàn)beforeDestory和destoryed打印出來的結(jié)果并沒有什么特別辕羽,el的值data的數(shù)據(jù)依然在的逛尚。這是因為$destroy只是銷毀一個實例,清理它與其它實例的連接刁愿,解綁它的全部指令及事件監(jiān)聽器黑低,并不會清除data的數(shù)據(jù)或者清除dom。具體理解可參考:https://cn.vuejs.org/v2/api/#vm-destroy

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酌毡,一起剝皮案震驚了整個濱河市克握,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枷踏,老刑警劉巖菩暗,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異旭蠕,居然都是意外死亡停团,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門掏熬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佑稠,“玉大人,你說我怎么就攤上這事旗芬∩嘟海” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵疮丛,是天一觀的道長幔嫂。 經(jīng)常有香客問我辆它,道長,這世上最難降的妖魔是什么履恩? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任锰茉,我火速辦了婚禮,結(jié)果婚禮上切心,老公的妹妹穿的比我還像新娘飒筑。我一直安慰自己,他們只是感情好绽昏,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布协屡。 她就那樣靜靜地躺著,像睡著了一般而涉。 火紅的嫁衣襯著肌膚如雪著瓶。 梳的紋絲不亂的頭發(fā)上联予,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天啼县,我揣著相機(jī)與錄音,去河邊找鬼沸久。 笑死季眷,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卷胯。 我是一名探鬼主播子刮,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼窑睁!你這毒婦竟也來了挺峡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤担钮,失蹤者是張志新(化名)和其女友劉穎橱赠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箫津,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡狭姨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了苏遥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饼拍。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖田炭,靈堂內(nèi)的尸體忽然破棺而出师抄,到底是詐尸還是另有隱情,我是刑警寧澤教硫,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布司澎,位于F島的核電站欺缘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挤安。R本人自食惡果不足惜谚殊,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛤铜。 院中可真熱鬧嫩絮,春花似錦、人聲如沸围肥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穆刻。三九已至置尔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氢伟,已是汗流浹背榜轿。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留朵锣,地道東北人谬盐。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像诚些,于是被迫代替她去往敵國和親飞傀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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