Vue 生命周期

首先昂利,每個(gè)Vue實(shí)例在被創(chuàng)建之前都要經(jīng)過(guò)一系列的初始化過(guò)程,這個(gè)過(guò)程就是vue的生命周期辑奈。首先看一張圖吧~這是官方文檔上的圖片相信大家一定都會(huì)很熟悉:


image.png

可以看到在vue一整個(gè)的生命周期中會(huì)有很多鉤子函數(shù)提供給我們?cè)趘ue生命周期不同的時(shí)刻進(jìn)行操作, 那么先列出所有的鉤子函數(shù),然后我們?cè)僖灰辉斀?

beforeCreate
created
beforeMount
mounted
beforeUpdate
updated
beforeDestroy
destroyed

先來(lái)一波ctrl+c,各位ctrl+v在瀏覽器中運(yùn)行,打開(kāi)console查看就行了:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>vue生命周期學(xué)習(xí)</title>
 <script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script>
</head>
<body>
 <div id="app">
   <h1>{{message}}</h1>
 </div>
</body>
<script>
 var vm = new Vue({
   el: '#app',
   data: {
     message: 'Vue的生命周期'
   },
   beforeCreate: function() {
     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: function() {
     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: function() {
     console.group('------beforeMount掛載前狀態(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); //已被初始化  
   },
   mounted: function() {
     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: function () {
     console.group('beforeUpdate 更新前狀態(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); 
   },
   updated: function () {
     console.group('updated 更新完成狀態(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); 
   },
   beforeDestroy: function () {
     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: function () {
     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>
</html>

運(yùn)行后打開(kāi)console可以看到打印出來(lái)內(nèi)容如下:

image.png

可以看到一個(gè)vue實(shí)例在創(chuàng)建過(guò)程中調(diào)用的幾個(gè)生命周期鉤子。

  1. 在beforeCreate和created鉤子函數(shù)之間的生命周期
    在這個(gè)生命周期之間抡柿,進(jìn)行初始化事件,進(jìn)行數(shù)據(jù)的觀測(cè)等恐,可以看到在created的時(shí)候數(shù)據(jù)已經(jīng)和data屬性進(jìn)行綁定(放在data中的屬性當(dāng)值發(fā)生改變的同時(shí)洲劣,視圖也會(huì)改變)。
    注意看下:此時(shí)還是沒(méi)有el選項(xiàng)

  2. created鉤子函數(shù)和beforeMount間的生命周期

[圖片上傳中...(image.png-eab2c1-1553501663335-0)]

在這一階段發(fā)生的事情還是比較多的课蔬。

首先會(huì)判斷對(duì)象是否有el選項(xiàng)囱稽。如果有的話就繼續(xù)向下編譯,如果沒(méi)有el選項(xiàng)二跋,則停止編譯战惊,也就意味著停止了生命周期,直到在該vue實(shí)例上調(diào)用vm.$mount(el)扎即。此時(shí)注釋掉代碼中:

el: '#app',

然后運(yùn)行可以看到到created的時(shí)候就停止了:

image.png

如果我們?cè)诤竺胬^續(xù)調(diào)用vm.$mount(el),可以發(fā)現(xiàn)代碼繼續(xù)向下執(zhí)行了

vm.$mount(el) //這個(gè)el參數(shù)就是掛在的dom接點(diǎn)
image.png

然后吞获,我們往下看况凉,template參數(shù)選項(xiàng)的有無(wú)對(duì)生命周期的影響。
(1).如果vue實(shí)例對(duì)象中有template參數(shù)選項(xiàng)各拷,則將其作為模板編譯成render函數(shù)刁绒。
(2).如果沒(méi)有template選項(xiàng),則將外部HTML作為模板編譯烤黍。
(3).可以看到template中的模板優(yōu)先級(jí)要高于outer HTML的優(yōu)先級(jí)知市。
修改代碼如下, 在HTML結(jié)構(gòu)中增加了一串html,在vue對(duì)象中增加了template選項(xiàng):

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>vue生命周期學(xué)習(xí)</title>
  <script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script>
</head>
<body>
  <div id="app">
    <!--html中修改的-->
    <h1>{{message + '這是在outer HTML中的'}}</h1>
  </div>
</body>
<script>
  var vm = new Vue({
    el: '#app',
    template: "<h1>{{message +'這是在template中的'}}</h1>", //在vue配置項(xiàng)中修改的
    data: {
      message: 'Vue的生命周期'
    }
</script>
</html>

執(zhí)行后的結(jié)果可以看到在頁(yè)面中顯示的是:


image.png

那么將vue對(duì)象中template的選項(xiàng)注釋掉后打印如下信息:


image.png

這下就可以想想什么el的判斷要在template之前了~是因?yàn)関ue需要通過(guò)el找到對(duì)應(yīng)的outer template蚊荣。

在vue對(duì)象中還有一個(gè)render函數(shù)初狰,它是以createElement作為參數(shù)莫杈,然后做渲染操作互例,而且我們可以直接嵌入JSX.

new Vue({
    el: '#app',
    render: function(createElement) {
        return createElement('h1', 'this is createElement')
    }
})

可以看到頁(yè)面中渲染的是:


image.png

所以綜合排名優(yōu)先級(jí):
render函數(shù)選項(xiàng) > template選項(xiàng) > outer HTML.

  1. beforeMount和mounted 鉤子函數(shù)間的生命周期


    image.png

    可以看到此時(shí)是給vue實(shí)例對(duì)象添加$el成員,并且替換掉掛在的DOM元素筝闹。因?yàn)樵谥癱onsole中打印的結(jié)果可以看到beforeMount之前el上還是undefined媳叨。

  2. mounted
    注意看下面截圖:


    image.png

    在mounted之前h1中還是通過(guò){{message}}進(jìn)行占位的,因?yàn)榇藭r(shí)還有掛在到頁(yè)面上关顷,還是JavaScript中的虛擬DOM形式存在的糊秆。在mounted之后可以看到h1中的內(nèi)容發(fā)生了變化。

  3. beforeUpdate鉤子函數(shù)和updated鉤子函數(shù)間的生命周期


    image.png

    當(dāng)vue發(fā)現(xiàn)data中的數(shù)據(jù)發(fā)生了改變议双,會(huì)觸發(fā)對(duì)應(yīng)組件的重新渲染痘番,先后調(diào)用beforeUpdate和updated鉤子函數(shù)。我們?cè)赾onsole中輸入:

vm.message = '觸發(fā)組件更新'

發(fā)現(xiàn)觸發(fā)了組件的更新:


image.png

6.beforeDestroy和destroyed鉤子函數(shù)間的生命周期


image.png

beforeDestroy鉤子函數(shù)在實(shí)例銷毀之前調(diào)用平痰。在這一步汞舱,實(shí)例仍然完全可用。
destroyed鉤子函數(shù)在Vue 實(shí)例銷毀后調(diào)用宗雇。調(diào)用后昂芜,Vue 實(shí)例指示的所有東西都會(huì)解綁定,所有的事件監(jiān)聽(tīng)器會(huì)被移除赔蒲,所有的子實(shí)例也會(huì)被銷毀泌神。

本文是個(gè)人對(duì)vue的生命周期的理解,有什么不對(duì)的地方還請(qǐng)大神多多指點(diǎn)~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舞虱,一起剝皮案震驚了整個(gè)濱河市欢际,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矾兜,老刑警劉巖幼苛,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異焕刮,居然都是意外死亡舶沿,警方通過(guò)查閱死者的電腦和手機(jī)墙杯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)括荡,“玉大人高镐,你說(shuō)我怎么就攤上這事』澹” “怎么了嫉髓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)邑闲。 經(jīng)常有香客問(wèn)我算行,道長(zhǎng),這世上最難降的妖魔是什么苫耸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任州邢,我火速辦了婚禮,結(jié)果婚禮上褪子,老公的妹妹穿的比我還像新娘量淌。我一直安慰自己,他們只是感情好嫌褪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布呀枢。 她就那樣靜靜地躺著,像睡著了一般笼痛。 火紅的嫁衣襯著肌膚如雪裙秋。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天缨伊,我揣著相機(jī)與錄音摘刑,去河邊找鬼。 笑死倘核,一個(gè)胖子當(dāng)著我的面吹牛泣侮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播紧唱,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼活尊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了漏益?” 一聲冷哼從身側(cè)響起蛹锰,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绰疤,沒(méi)想到半個(gè)月后铜犬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年癣猾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敛劝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纷宇,死狀恐怖夸盟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情像捶,我是刑警寧澤上陕,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站拓春,受9級(jí)特大地震影響释簿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜硼莽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一庶溶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沉删,春花似錦渐尿、人聲如沸醉途。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)隘擎。三九已至殴穴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間货葬,已是汗流浹背采幌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留震桶,地道東北人休傍。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蹲姐,于是被迫代替她去往敵國(guó)和親磨取。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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