vue中組件的生命周期

每一個(gè)組件或者實(shí)例都會(huì)經(jīng)歷一個(gè)完整的生命周期碟嘴,總共分為三個(gè)階段:初始化鞋既、運(yùn)行中贮配、銷毀谍倦。

官網(wǎng)中生命周期圖示
在生命周期中,總結(jié)了八個(gè)過(guò)程:
  1. 實(shí)例泪勒、組件通過(guò)new Vue() 創(chuàng)建出來(lái)之后會(huì)初始化事件和生命周期昼蛀,然后就會(huì)執(zhí)行beforeCreate鉤子函數(shù),這個(gè)時(shí)候圆存,數(shù)據(jù)還沒(méi)有掛載ね叼旋,只是一個(gè)空殼,無(wú)法訪問(wèn)到數(shù)據(jù)和真實(shí)的dom沦辙,一般不做操作

  2. 掛載數(shù)據(jù)夫植,綁定事件等等,然后執(zhí)行created函數(shù)油讯,這個(gè)時(shí)候已經(jīng)可以使用到數(shù)據(jù)详民,也可以更改數(shù)據(jù),在這里更改數(shù)據(jù)不會(huì)觸發(fā)updated函數(shù),在這里可以在渲染前倒數(shù)第二次更改數(shù)據(jù)的機(jī)會(huì)陌兑,不會(huì)觸發(fā)其他的鉤子函數(shù)沈跨,一般可以在這里做初始數(shù)據(jù)的獲取

  3. 接下來(lái)開始找實(shí)例或者組件對(duì)應(yīng)的模板,編譯模板為虛擬dom放入到render函數(shù)中準(zhǔn)備渲染诀紊,然后執(zhí)行beforeMount鉤子函數(shù)谒出,在這個(gè)函數(shù)中虛擬dom已經(jīng)創(chuàng)建完成,馬上就要渲染,在這里也可以更改數(shù)據(jù)邻奠,不會(huì)觸發(fā)updated笤喳,在這里可以在渲染前最后一次更改數(shù)據(jù)的機(jī)會(huì),不會(huì)觸發(fā)其他的鉤子函數(shù)碌宴,一般可以在這里做初始數(shù)據(jù)的獲取

  4. 接下來(lái)開始render杀狡,渲染出真實(shí)dom,然后執(zhí)行mounted鉤子函數(shù)贰镣,此時(shí)呜象,組件已經(jīng)出現(xiàn)在頁(yè)面中,數(shù)據(jù)碑隆、真實(shí)dom都已經(jīng)處理好了,事件都已經(jīng)掛載好了恭陡,可以在這里操作真實(shí)dom等事情...

  5. 當(dāng)組件或?qū)嵗臄?shù)據(jù)更改之后,會(huì)立即執(zhí)行beforeUpdate上煤,然后vue的虛擬dom機(jī)制會(huì)重新構(gòu)建虛擬dom與上一次的虛擬dom樹利用diff算法進(jìn)行對(duì)比之后重新渲染休玩,一般不做什么事兒

  6. 當(dāng)更新完成后,執(zhí)行updated,數(shù)據(jù)已經(jīng)更改完成拴疤,dom也重新render完成永部,可以操作更新后的虛擬dom

  7. 當(dāng)經(jīng)過(guò)某種途徑調(diào)用$destroy方法后,立即執(zhí)行beforeDestroy呐矾,一般在這里做一些善后工作苔埋,例如清除計(jì)時(shí)器、清除非指令綁定的事件等等

  8. 組件的數(shù)據(jù)綁定蜒犯、監(jiān)聽...去掉后只剩下dom空殼组橄,這個(gè)時(shí)候,執(zhí)行destroyed愧薛,在這里做善后工作也可以晨炕。

用代碼來(lái)說(shuō)明組件中生命周期的運(yùn)行原理:
<!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>
    <link rel="stylesheet" >
</head>
<body>
    <div id="app">
        <aaa></aaa>
    </div>

    
    <template id="aaa">
        <div>
            <p class="myp">A組件</p>
            <button @click="destroy">destroy</button>
            <input type="text" v-model="msg">
            <p>msg:{{msg}}</p>
        </div>
    </template>



</body>
<script src="./base/vue.js"></script>

<script>
    //生命周期:初始化階段 運(yùn)行中階段 銷毀階段
    Vue.component("aaa",{
        template:"#aaa",
        data:function(){
            return {msg:'hello'}
        },
        timer:null,
        methods:{
            destroy:function(){
                this.$destroy()//
            }
        },
        beforeCreate:function(){
            console.log('beforeCreate:剛剛new Vue()之后,這個(gè)時(shí)候毫炉,數(shù)據(jù)還沒(méi)有掛載ね瓮栗,只是一個(gè)空殼')           
            console.log(this.msg)//undefined
            console.log(document.getElementsByClassName("myp")[0])//undefined
        },
        created:function(){
            console.log('created:這個(gè)時(shí)候已經(jīng)可以使用到數(shù)據(jù),也可以更改數(shù)據(jù),在這里更改數(shù)據(jù)不會(huì)觸發(fā)updated函數(shù)')
            this.msg+='!!!'
            console.log('在這里可以在渲染前倒數(shù)第二次更改數(shù)據(jù)的機(jī)會(huì)瞄勾,不會(huì)觸發(fā)其他的鉤子函數(shù)费奸,一般可以在這里做初始數(shù)據(jù)的獲取')
            console.log('接下來(lái)開始找實(shí)例或者組件對(duì)應(yīng)的模板,編譯模板為虛擬dom放入到render函數(shù)中準(zhǔn)備渲染')
        },
        beforeMount:function(){
            console.log('beforeMount:虛擬dom已經(jīng)創(chuàng)建完成进陡,馬上就要渲染,在這里也可以更改數(shù)據(jù)愿阐,不會(huì)觸發(fā)updated')
            this.msg+='@@@@'
            console.log('在這里可以在渲染前最后一次更改數(shù)據(jù)的機(jī)會(huì),不會(huì)觸發(fā)其他的鉤子函數(shù)趾疚,一般可以在這里做初始數(shù)據(jù)的獲取')
            console.log(document.getElementsByClassName("myp")[0])//undefined
            console.log('接下來(lái)開始render缨历,渲染出真實(shí)dom')
        },
        // render:function(createElement){
        //     console.log('render')
        //     return createElement('div','hahaha')
        // },
        mounted:function(){ 
            console.log('mounted:此時(shí),組件已經(jīng)出現(xiàn)在頁(yè)面中糙麦,數(shù)據(jù)辛孵、真實(shí)dom都已經(jīng)處理好了,事件都已經(jīng)掛載好了')
            console.log(document.getElementsByClassName("myp")[0])
            console.log('可以在這里操作真實(shí)dom等事情...')

           this.$options.timer = setInterval(function () {
               console.log('setInterval')
                this.msg+='!'  
           }.bind(this),500)
        },
        beforeUpdate:function(){
            console.log('beforeUpdate:重新渲染之前觸發(fā)')
            console.log('然后vue的虛擬dom機(jī)制會(huì)重新構(gòu)建虛擬dom與上一次的虛擬dom樹利用diff算法進(jìn)行對(duì)比之后重新渲染')         
        },
        updated:function(){
            console.log('updated:數(shù)據(jù)已經(jīng)更改完成,dom也重新render完成')
        },
        beforeDestroy:function(){
            console.log('beforeDestory:銷毀前執(zhí)行($destroy方法被調(diào)用的時(shí)候就會(huì)執(zhí)行),一般在這里擦屁股:清除計(jì)時(shí)器赡磅、清除非指令綁定的事件等等...')
            clearInterval(this.$options.timer)
        },
        destroyed:function(){
            console.log('destroyed:組件的數(shù)據(jù)綁定魄缚、監(jiān)聽...都去掉了,只剩下dom空殼')
        }
    })


    
    new Vue({
    }).$mount('#app')


</script>
</html>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市焚廊,隨后出現(xiàn)的幾起案子冶匹,更是在濱河造成了極大的恐慌,老刑警劉巖咆瘟,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚼隘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡袒餐,警方通過(guò)查閱死者的電腦和手機(jī)飞蛹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門须肆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人桩皿,你說(shuō)我怎么就攤上這事〈闭ǎ” “怎么了泄隔?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宛徊。 經(jīng)常有香客問(wèn)我佛嬉,道長(zhǎng),這世上最難降的妖魔是什么闸天? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任暖呕,我火速辦了婚禮,結(jié)果婚禮上苞氮,老公的妹妹穿的比我還像新娘湾揽。我一直安慰自己,他們只是感情好笼吟,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布库物。 她就那樣靜靜地躺著,像睡著了一般贷帮。 火紅的嫁衣襯著肌膚如雪戚揭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天撵枢,我揣著相機(jī)與錄音民晒,去河邊找鬼。 笑死锄禽,一個(gè)胖子當(dāng)著我的面吹牛潜必,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沟绪,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼刮便,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绽慈?” 一聲冷哼從身側(cè)響起恨旱,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坝疼,沒(méi)想到半個(gè)月后搜贤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钝凶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年仪芒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唁影。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掂名,死狀恐怖据沈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饺蔑,我是刑警寧澤锌介,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站猾警,受9級(jí)特大地震影響孔祸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜发皿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一崔慧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧穴墅,春花似錦惶室、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至誉结,卻和暖如春鹅士,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惩坑。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工掉盅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人以舒。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓趾痘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蔓钟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子永票,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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