Vue生命周期鉤子函數(shù)

生命周期鉤子就好像是把人的出生到死亡分成一個個階段,你肯定是在出生階段起名字,而不會在成年或者死亡的階段去起名字幕庐。組件也是一樣, Vue 實(shí)例從開始創(chuàng)建家淤、初始化數(shù)據(jù)异剥、編譯模板、掛載Dom→渲染絮重、更新→渲染冤寿、卸載等一系列過程歹苦,我們稱這是 Vue 的生命周期,各個階段有相對應(yīng)的事件鉤子督怜,用戶可以在特定的階段調(diào)用特定的方法殴瘦。每個階段組件內(nèi)部的屬性都是不一樣的叉钥,比如created鉤子時(shí)視圖還沒有渲染敛惊,就不能做一些dom操作。所以一般特定的鉤子做特定的事荒澡。

一姨蟋、Vue生命周期圖

?

二屉凯、Lifecycle hooks詳解

beforeCreate:在實(shí)例初始化之后,數(shù)據(jù)觀測 (data observer) 和event/watcher 事件配置之前被調(diào)用芬探。

created:在實(shí)例創(chuàng)建完成后被立即調(diào)用神得。在這一步,實(shí)例已完成以下的配置:數(shù)據(jù)觀測 (data observer)偷仿,屬性和方法的運(yùn)算哩簿,watch/event 事件回調(diào)。然而酝静,掛載階段還沒開始节榜,$el 屬性目前不可見。

beforeMount:在掛載開始之前被調(diào)用:相關(guān)的 render 函數(shù)首次被調(diào)用别智。(該鉤子在服務(wù)器端渲染期間不被調(diào)用)

mounted:el 被新創(chuàng)建的 vm.$el 替換宗苍,并掛載到實(shí)例上去之后調(diào)用該鉤子。如果 root 實(shí)例掛載了一個文檔內(nèi)元素薄榛,當(dāng) mounted 被調(diào)用時(shí) vm.$el 也在文檔內(nèi)讳窟。

beforeUpdate:數(shù)據(jù)更新時(shí)調(diào)用,發(fā)生在虛擬 DOM 打補(bǔ)丁之前敞恋。這里適合在更新之前訪問現(xiàn)有的 DOM丽啡,比如手動移除已添加的事件監(jiān)聽器。(該鉤子在服務(wù)器端渲染期間不被調(diào)用硬猫,因?yàn)橹挥谐醮武秩緯诜?wù)端進(jìn)行补箍。)

updated:由于數(shù)據(jù)更改導(dǎo)致的虛擬 DOM 重新渲染和打補(bǔ)丁,在這之后會調(diào)用該鉤子啸蜜。當(dāng)這個鉤子被調(diào)用時(shí)坑雅,組件 DOM 已經(jīng)更新,所以你現(xiàn)在可以執(zhí)行依賴于 DOM 的操作衬横。然而在大多數(shù)情況下裹粤,應(yīng)該避免在此期間更改狀態(tài)。如果要相應(yīng)狀態(tài)改變蜂林,通常最好使用計(jì)算屬性或 watcher 取而代之蛹尝。

activated:keep-alive 組件激活時(shí)調(diào)用后豫。(該鉤子在服務(wù)器端渲染期間不被調(diào)用)

deactivated: keep-alive 組件停用時(shí)調(diào)用。(該鉤子在服務(wù)器端渲染期間不被調(diào)用)

beforeDestory: 實(shí)例銷毀之前調(diào)用突那。在這一步挫酿,實(shí)例仍然完全可用。(該鉤子在服務(wù)器端渲染期間不被調(diào)用)

destroyed: Vue 實(shí)例銷毀后調(diào)用愕难。調(diào)用后早龟,Vue 實(shí)例指示的所有東西都會解綁定,所有的事件監(jiān)聽器會被移除猫缭,所有的子實(shí)例也會被銷毀葱弟。(該鉤子在服務(wù)器端渲染期間不被調(diào)用)

三、注意

所有的生命周期鉤子自動綁定 this 上下文到實(shí)例中猜丹,因此你可以訪問數(shù)據(jù)芝加,對屬性和方法進(jìn)行運(yùn)算。這意味著你不能使用箭頭函數(shù)來定義一個生命周期方法 (例如 created: () => this.fetchTodos())射窒。這是因?yàn)榧^函數(shù)綁定了父上下文藏杖,因此 this 與你期待的 Vue 實(shí)例不同,this.fetchTodos 的行為未定義脉顿。

// good

created: function() {} 

created() {}

// error

created: () => {}

四蝌麸、生命周期執(zhí)行順序

<!DOCTYPE html>
<html>

<head>
  <title>Vue生命周期</title>
  <script type="text/javascript" src="https://cdn.jsdelivr.net/vue/2.1.3/vue.js"></script>
</head>

<body>
  <div id="app">
    <p>{{ message }}</p>
  </div>

  <script type="text/javascript">
    var app = new Vue({
      el: '#app',
      data: {
        message: "Hello World"
      },
      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) //undefined 
      },
      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("%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("%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("%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("%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("%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("%c%s", "color:red", "data   : " + this.$data);
        console.log("%c%s", "color:red", "message: " + this.message)
      }
    })
  </script>
</body>

</html>

按F12打開瀏覽器控制臺,查看console結(jié)果

由上圖我們會發(fā)現(xiàn)沒有執(zhí)行beforeUpdate艾疟、updated来吩、beforeDestory、destroyed這四個函數(shù)蔽莱。

1弟疆、beforeCreate 此時(shí)$el、data 的值都為undefined

2盗冷、創(chuàng)建之后兽间,此時(shí)可以拿到data的值,但是$el依舊為undefined

3正塌、mount之前,$el的值為“虛擬”的元素節(jié)點(diǎn)

4恤溶、mount之后乓诽,mounted之前,“虛擬”的dom節(jié)點(diǎn)被真實(shí)的dom節(jié)點(diǎn)替換咒程,并將其插入到dom樹中鸠天,于是在觸發(fā)mounted時(shí),可以獲取到$el為真實(shí)的dom元素()

五帐姻、beforeUpdate | updated

接著嘗試在瀏覽器控制臺改變data的數(shù)據(jù)值稠集,輸入以下命令

app.message='Hello Demi'

data里面的值被修改后奶段,就會觸發(fā)beforeUpdate和updated操作

六、destroy | destroyed

接著嘗試在瀏覽器控制臺輸入以下命令

app.$destroy()

對vue實(shí)例進(jìn)行銷毀剥纷,銷毀之后所有東西都會解除綁定痹籍,所有的事件監(jiān)聽器會被移除,所有的子實(shí)例也會被銷毀晦鞋。

七蹲缠、使用場景

  • beforeCreate:舉個栗子:可以在這加個loading事件
  • created:在這結(jié)束loading,還做一些初始化悠垛,實(shí)現(xiàn)函數(shù)自執(zhí)行
  • mounted:在這發(fā)起后端請求线定,拿回?cái)?shù)據(jù),配合路由鉤子做一些事情
  • beforeDestroyed:你確認(rèn)刪除XX嗎确买?
  • destroyed :當(dāng)前組件已被刪除斤讥,清空相關(guān)內(nèi)容

八、參考鏈接

http://www.cnblogs.com/gagag/p/6246493.html

文章每周持續(xù)更新湾趾,可以微信搜索「 前端大集錦 」第一時(shí)間閱讀芭商,回復(fù)【視頻】【書籍】領(lǐng)取200G視頻資料和30本PDF書籍資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市撑帖,隨后出現(xiàn)的幾起案子蓉坎,更是在濱河造成了極大的恐慌,老刑警劉巖胡嘿,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛉艾,死亡現(xiàn)場離奇詭異,居然都是意外死亡衷敌,警方通過查閱死者的電腦和手機(jī)勿侯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缴罗,“玉大人助琐,你說我怎么就攤上這事∶婷ィ” “怎么了兵钮?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長舌界。 經(jīng)常有香客問我掘譬,道長,這世上最難降的妖魔是什么呻拌? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任葱轩,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘靴拱。我一直安慰自己垃喊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布袜炕。 她就那樣靜靜地躺著本谜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妇蛀。 梳的紋絲不亂的頭發(fā)上耕突,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機(jī)與錄音评架,去河邊找鬼眷茁。 笑死,一個胖子當(dāng)著我的面吹牛纵诞,可吹牛的內(nèi)容都是我干的上祈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼浙芙,長吁一口氣:“原來是場噩夢啊……” “哼登刺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嗡呼,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纸俭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后南窗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揍很,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年万伤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窒悔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡敌买,死狀恐怖简珠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情虹钮,我是刑警寧澤聋庵,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站芙粱,受9級特大地震影響祭玉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宅倒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拐迁,春花似錦蹭劈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缓淹,卻和暖如春哈打,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背讯壶。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工料仗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伏蚊。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓立轧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親躏吊。 傳聞我的和親對象是個殘疾皇子氛改,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355