淺析vue的生命周期,希望你能看得懂

每個實例從創(chuàng)建到銷毀,其實就是經(jīng)歷了生命周期。正如我們自己,生老病死,也是一個生命周期,當我們需要給我們生命添加顏色的時候,就出現(xiàn)了鉤子函數(shù)。

實例代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>生命周期</title>
</head>
<body>
    <div id="app">
        <p>{{msg}},我要去打怪獸?。?!</p>
    </div>
    
    <script src="./base/vue.js"></script>
    <script>
      var app = new Vue({
            el:"#app",
            // template:"<div>我是大頭兒子<div/>",
            // render(createElemnt){
            //     return createElemnt('h1',"我是蜘蛛俠")
            // },
            data:{
                msg:"我是迪迦凹凸曼",
            },
            
            beforeCreate(){
                console.log("befroeCreate創(chuàng)建前...")
                console.log(this.$el)
                console.log(this.$data)
            },
            created(){
                console.log("created創(chuàng)建完畢...")
                console.log(this.$el)
                console.log(this.$data)
            },
            beforeMount(){
                console.log("befroeMount掛載前...")
                console.log(this.$el)
                console.log(this.$data)
            },
            mounted(){
                console.log("mounted掛載完畢...")
                console.log(this.$el)
                console.log(this.$data)
            },
            beforeUpdate: function () {
                console.log("beforeUpdate更新之前...")
                console.log(this.$el)
                console.log(this.$data)
            },
            updated(){
                console.log("Updated更新后...")
                console.log(this.$el)
                console.log(this.$data)
            },
            beforeDestroy(){
                console.log("beforeDestroy銷毀前...")
                console.log(this.$el)
                console.log(this.$data)
            },
            destroyed(){
                console.log("destroyed銷毀完成...")
                console.log(this.$el)
                console.log(this.$data)
            }

            
        })
    </script>
</body>
</html>

生命周期

一.初始化階段

1.一個組件或?qū)嵗纳芷诙际菑膎ew開始的

2.實例化之后,內(nèi)部會對初始化事件與生命周期做相關的配置

3.befroeCreate()鉤子函數(shù)之前,此時該實例內(nèi)的所有東西都還沒有創(chuàng)建,所以數(shù)據(jù)(data)和dom(el)節(jié)點都不能獲取到

輸出結(jié)果


avatar

4.在created的時候鉤子函數(shù)掛載完畢,數(shù)據(jù)已經(jīng)和data屬性進行綁定,所以可以獲取到數(shù)據(jù),并可以對獲取到的數(shù)據(jù)進行更改,但是真實的dom節(jié)點還是獲取不到,

avatar

通常我們會在created鉤子函數(shù)中進行,事件的綁定和ajax異步請求數(shù)據(jù),因為created在創(chuàng)建完畢會進行數(shù)據(jù)劫持,添加getter和sertter
Vue 響應式核心就是,setter 的時候會收集依賴,getter 的時候會觸發(fā)依賴更新

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

首先,會判斷是否存在$el選項,如果有的話就繼續(xù)向下編譯,如果沒有el選項,則停止編譯,也就意味著停止了生命周期。
沒有el,就調(diào)用vm.$mount(el)[也就是動態(tài)引入了el],
其次,判斷是組件還是vue實例,是否添加了template組件

這就考慮到tempate與outerHTML的優(yōu)先級的問題了


avatar

avatar

注:template選項>outer Html

其實在我們添加或者判斷template時還有一個render()

它是以createElement作為參數(shù),然后做渲染,而且可以直接嵌入JSX。


avatar

acatar

注:綜合排名優(yōu)先級:render函數(shù)>template選項>outer Html

6.befroeMount()鉤子函數(shù)代表真實的dom馬上就渲染出來,可以看到{{msg}}并沒有渲染出來,所以頁面并中沒有生成真實的dom

avatar

生成好虛擬的dom后,可以用render函數(shù)替換對應的el,渲染成真實dom結(jié)構(gòu)

7.mounted(),出現(xiàn)真實dom結(jié)構(gòu),初始化最后的鉤子函數(shù),

數(shù)據(jù)掛載完畢,所以掛載元素中顯示的是msg的值

這個鉤子函數(shù)dom獲取的數(shù)據(jù)內(nèi)容是更新前的內(nèi)容?


acatar

二、運行中階段

總體流程

acatar

8.befroeUpdate鉤子函數(shù)不會自己執(zhí)行,當vue發(fā)現(xiàn)data中的數(shù)據(jù)發(fā)生變化(修改真實dom),會觸發(fā)對應組件的重新渲染,當數(shù)據(jù)改變后調(diào)用beforeupdata

acatar

acatar

9.Update()鉤子函數(shù),當數(shù)據(jù)更改后調(diào)用befroeUpdate鉤子函數(shù)后,當頁面渲染完成后調(diào)用updated

獲取的內(nèi)容是更新后的數(shù)據(jù),生成虛擬的dom,與之前的虛擬dom進行對比,通過DIss算法
重新進行render()?


acatar

注:這點可以通過在updated鉤子函數(shù)中使用alert打斷程序運行,可以看到頁面中并沒有更新,而且通過官方流程圖也可以看出。

三、銷毀階段

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

befroeDestroy()銷毀前,用來銷毀定時器以及初始化的事宜
destroyed()銷毀后,雙向數(shù)據(jù)綁定,組件的監(jiān)聽被移除,所有的子實例都會被銷毀,但是dom結(jié)構(gòu)還是存在的,但是不能渲染了
acatar

注:銷毀后不能對dom修改而影響view了

總結(jié)

其實整個流程都可以從vue官網(wǎng)圖示,看的的出來,其中還有還多的細節(jié)沒有講出來,有不足的地方,請各位大神多多建議.希望本文會對你有所幫助。

官網(wǎng)圖示

acatar
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容