Vue父子組件生命周期執(zhí)行順序

  • 加載渲染過程

-> 父beforeCreate -> 父created -> 父beforeMount
-> 子beforeCreate -> 子created -> 子beforeMount -> 子mounted
-> 父mounted

  • 子組件更新過程

-> 父beforeUpdate
-> 子beforeUpdate -> 子updated
-> 父updated

  • 父組件更新過程

-> 父beforeUpdate -> 父updated

  • 銷毀過程

-> 父beforeDestroy
-> 子beforeDestroy -> 子destroyed
-> 父destroyed

1暮胧、vue的生命周期

2吻育、實(shí)際操作

下面我們在實(shí)際的代碼執(zhí)行過程中理解父子組件生命周期創(chuàng)建過程以及鉤子函數(shù)執(zhí)行的實(shí)時(shí)狀態(tài)變化。
測試基于下面的代碼环鲤,引入vue.js文件后即可執(zhí)行。(打開頁面后狱杰,再按一次刷新會自動進(jìn)入debugger狀態(tài))

<!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>Document</title>
    <style>

    </style>
</head>
<body>
<div id="app">
    <p>{{message}}</p>
    <keep-alive>
        <my-components :msg="msg1" v-if="show"></my-components>
    </keep-alive>
</div>
</body>
<script src="../../node_modules/vue/dist/vue.js"></script>
<script>
    var child = {
        template: '<div>from child: {{childMsg}}</div>',
        props: ['msg'],
        data: function() { return {
                childMsg: 'child' }
        },
        beforeCreate: function () { debugger;
        },
        created: function () { debugger;
        },
        beforeMount: function () { debugger;
        },
        mounted: function () { debugger;
        },
        deactivated: function(){
            alert("keepAlive停用");
        },
        activated: function () {
            console.log('component activated');
        },
        beforeDestroy: function () {
            console.group('beforeDestroy 銷毀前狀態(tài)===============》'); var state = { 'el': this.$el, 'data': this.$data, 'message': this.message
            }
            console.log(this.$el);
            console.log(state);
        },
        destroyed: function () {
            console.group('destroyed 銷毀完成狀態(tài)===============》'); var state = { 'el': this.$el, 'data': this.$data, 'message': this.message
            }
            console.log(this.$el);
            console.log(state);
        },
    }; var vm = new Vue({
        el: '#app',
        data: {
                message: 'father',
                msg1: "hello",
                show: true },
        beforeCreate: function () { debugger;
        },
        created: function () { debugger;
        },
        beforeMount: function () { debugger;
        },
        mounted: function () { debugger;
        },
        beforeUpdate: function () {
            alert("頁面視圖更新前");

        },
        updated: function () {
            alert("頁面視圖更新后");
        },
        beforeDestroy: function () {
            console.group('beforeDestroy 銷毀前狀態(tài)===============》'); var state = { 'el': this.$el, 'data': this.$data, 'message': this.message
            }
            console.log(this.$el);
            console.log(state);
        },
        destroyed: function () {
            console.group('destroyed 銷毀完成狀態(tài)===============》'); var state = { 'el': this.$el, 'data': this.$data, 'message': this.message
            }
            console.log(this.$el);
            console.log(state);
        },
        components: { 'my-components': child
        }
    }); </script>
</html>

3.1搬味、生命周期調(diào)試

首先我們創(chuàng)建了一個(gè)Vue實(shí)例vm章郁,將其掛載到頁面中id為“app”的元素上。

3.1.1制市、根組件的beforeCreate階段

可以看出抬旺,在調(diào)用beforeCreate()函數(shù)時(shí),只進(jìn)行了一些必要的初始化操作(例如一些全局的配置和根實(shí)例的一些屬性初始化)祥楣,此時(shí)data屬性為undefined开财,沒有可供操作的數(shù)據(jù)。

3.1.2误褪、根組件的Created階段

調(diào)用Created()函數(shù)床未,在這一步,實(shí)例已完成以下的配置:數(shù)據(jù)代理和動態(tài)數(shù)據(jù)綁定(data observer)振坚,屬性和方法的運(yùn)算薇搁, watch/event 事件回調(diào)。然而渡八,掛載階段還沒開始啃洋,$el 屬性目前不可見传货。

3.1.3、根組件的beforeMount階段

在調(diào)用boforeMount()函數(shù)前首先會判斷對象是否有el選項(xiàng)宏娄。如果有的話就繼續(xù)向下編譯问裕,如果沒有el選項(xiàng),則停止編譯孵坚,也就意味著停止了生命周期粮宛,直到在該vue實(shí)例上調(diào)用vm.$mount(el)

在這個(gè)例子中,我們有el元素卖宠,因此會調(diào)用boforeMount()函數(shù),此時(shí)已經(jīng)開始執(zhí)行模板解析函數(shù)巍杈,但還沒有將$el元素掛載頁面,頁面視圖因此也未更新扛伍。在標(biāo)紅處筷畦,還是 {{message}},這里就是應(yīng)用的 Virtual DOM(虛擬Dom)技術(shù)刺洒,先把坑占住了鳖宾。到后面mounted掛載的時(shí)候再把值渲染進(jìn)去。

3.1.4逆航、子組件的beforeCreate鼎文、Created、beforeMount因俐、Mounted階段

在父組件執(zhí)行beforeMount階段后拇惋,進(jìn)入子組件的beforeCreate、Created女揭、beforeMount階段蚤假,這些階段和父組件類似,按下不表吧兔。beforeMount階段后磷仰,執(zhí)行的是Mounted階段,該階段時(shí)子組件已經(jīng)掛載到父組件上境蔼,并且父組件隨之掛載到頁面中灶平。
由下圖可以知道,在beforeMount階段之后箍土、Mounted階段之前逢享,數(shù)據(jù)已經(jīng)被加載到視圖上了,即$el元素被掛載到頁面時(shí)觸發(fā)了視圖的更新吴藻。

3.1.5瞒爬、子組件的activated階段

我們發(fā)現(xiàn)在子父組件全部掛載到頁面之后被觸發(fā)。這是因?yàn)樽咏M件my-components被<keep-alive> 包裹,隨$el的掛載被觸發(fā)侧但。如果子組件沒有被<keep-alive>包裹矢空,那么該階段將不會被觸發(fā)。

3.1.6禀横、父組件的mounted階段

mounted執(zhí)行時(shí):此時(shí)el已經(jīng)渲染完成并掛載到實(shí)例上。
至此柏锄,從Vue實(shí)例的初始化到將新的模板掛載到頁面上的階段已經(jīng)完成酿箭,退出debugger。下面我們來看一下deactivated趾娃、beforeUpdate缭嫡、updated、beforeDestroy茫舶、destroyed鉤子函數(shù)械巡。

3.2刹淌、deactivated饶氏、beforeUpdate、updated階段

由生命周期函數(shù)可知:當(dāng)數(shù)據(jù)變化后有勾、虛擬DOM渲染重新渲染頁面前會觸發(fā)beforeUpdate()函數(shù)疹启,此時(shí)視圖還未改變。當(dāng)虛擬DOM渲染頁面視圖更新后會觸發(fā)updated()函數(shù)蔼卡。

我們不妨改變vm.show = false喊崖,當(dāng)修改這個(gè)屬性時(shí),不僅會觸發(fā)beforeUpdate雇逞、updated函數(shù)荤懂,還會觸發(fā)deactivated函數(shù)(因?yàn)閗eep-alive 組件停用時(shí)調(diào)用)。我們不妨想一下deactivated函數(shù)會在beforeUpdate后還是updated后調(diào)用塘砸。
我們在控制臺輸入vm.show = false节仿。得到三者的調(diào)用順序分別為beforeUpdate、deactivated掉蔬、updated廊宪。我們可以知道的是deactivated函數(shù)的觸發(fā)時(shí)間是在視圖更新時(shí)觸發(fā)。因?yàn)楫?dāng)視圖更新時(shí)才能知道keep-alive組件被停用了女轿。

3.3箭启、beforeDestroy和destroyed鉤子函數(shù)間的生命周期

現(xiàn)在我們對Vue實(shí)例進(jìn)行銷毀,調(diào)用app.$destroy()方法即可將其銷毀蛉迹,控制臺測試如下:

我們發(fā)現(xiàn)實(shí)例依然存在傅寡,但是此時(shí)變化已經(jīng)發(fā)生在了其他地方。
beforeDestroy鉤子函數(shù)在實(shí)例銷毀之前調(diào)用。在這一步荐操,實(shí)例仍然完全可用大猛。
destroyed鉤子函數(shù)在Vue 實(shí)例銷毀后調(diào)用。調(diào)用后淀零,Vue 實(shí)例指示的所有東西都會解綁定挽绩,所有的事件監(jiān)聽器會被移除,所有的子實(shí)例也會被銷毀(也就是說子組件也會觸發(fā)相應(yīng)的函數(shù))驾中。這里的銷毀并不指代'抹去'唉堪,而是表示'解綁'。
銷毀時(shí)beforeDestory函數(shù)的傳遞順序?yàn)橛筛傅阶蛹缑瘢琩estory的傳遞順序?yàn)橛勺拥礁浮?/p>

4唠亚、一些應(yīng)用鉤子函數(shù)的想法

  • 在created鉤子中可以對data數(shù)據(jù)進(jìn)行操作,這個(gè)時(shí)候可以進(jìn)行ajax請求將返回的數(shù)據(jù)賦給data持痰。

  • 雖然updated函數(shù)會在數(shù)據(jù)變化時(shí)被觸發(fā)灶搜,但卻不能準(zhǔn)確的判斷是那個(gè)屬性值被改變,所以在實(shí)際情況中用computed或match函數(shù)來監(jiān)聽屬性的變化工窍,并做一些其他的操作割卖。

  • 在mounted鉤子對掛載的dom進(jìn)行操作,此時(shí)患雏,DOM已經(jīng)被渲染到頁面上鹏溯。

  • 在使用vue-router時(shí)有時(shí)需要使用<keep-alive></keep-alive>來緩存組件狀態(tài),這個(gè)時(shí)候created鉤子就不會被重復(fù)調(diào)用了淹仑,如果我們的子組件需要在每次加載或切換狀態(tài)的時(shí)候進(jìn)行某些操作丙挽,可以使用activated鉤子觸發(fā)。

  • 所有的生命周期鉤子自動綁定 this 上下文到實(shí)例中匀借,所以不能使用箭頭函數(shù)來定義一個(gè)生命周期方法 (例如 created: () => this.fetchTodos())颜阐。這是導(dǎo)致this指向父級。

轉(zhuǎn)載于:https://www.cnblogs.com/caoshouling/p/13403019.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吓肋,一起剝皮案震驚了整個(gè)濱河市凳怨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蓬坡,老刑警劉巖猿棉,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異屑咳,居然都是意外死亡萨赁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門兆龙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杖爽,“玉大人敲董,你說我怎么就攤上這事∥堪玻” “怎么了腋寨?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長化焕。 經(jīng)常有香客問我萄窜,道長,這世上最難降的妖魔是什么撒桨? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任查刻,我火速辦了婚禮,結(jié)果婚禮上凤类,老公的妹妹穿的比我還像新娘穗泵。我一直安慰自己,他們只是感情好谜疤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布佃延。 她就那樣靜靜地躺著,像睡著了一般夷磕。 火紅的嫁衣襯著肌膚如雪履肃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天企锌,我揣著相機(jī)與錄音榆浓,去河邊找鬼于未。 笑死撕攒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烘浦。 我是一名探鬼主播抖坪,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闷叉!你這毒婦竟也來了擦俐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤握侧,失蹤者是張志新(化名)和其女友劉穎蚯瞧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體品擎,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埋合,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萄传。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甚颂。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出振诬,到底是詐尸還是另有隱情蹭睡,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布赶么,位于F島的核電站肩豁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辫呻。R本人自食惡果不足惜蓖救,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望印屁。 院中可真熱鬧循捺,春花似錦、人聲如沸雄人。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽础钠。三九已至恰力,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旗吁,已是汗流浹背踩萎。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留很钓,地道東北人香府。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像码倦,于是被迫代替她去往敵國和親企孩。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344