1. 程式人生 > 實用技巧 >Vue-生命週期

Vue-生命週期

vue生命週期示意圖:
以程式碼為例對上述過程進行解釋::

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <input  v-model="message"/>
    <p>{{message}}</p>
    <button @click="clickfun">按鈕</button>
</div>
</body>
<script>
    var myVue = new Vue({
        el: '#app',
        data: function () {
            return {
                message: 'XXXX'
            };
        },
        beforeCreate: function () {
            console.group('beforeCreate 建立前狀態===============》');
            var state = {
                'el': this.$el,
                'data': this.$data,
                'message': this.message
            }
            console.log(state);
        },
        created: function () {
            console.group('created 建立完畢狀態===============》');
            var state = {
                'el': this.$el,
                'data': this.$data,
                'message': this.message
            }
            console.log(state);
        },
        beforeMount: function () {
            console.group('beforeMount 掛載前狀態===============》');
            var state = {
                'el': this.$el,
                'data': this.$data,
                'message': this.message
            }
            console.log(this.$el);
            console.log(state);
        },
        mounted: function () {
            console.group('mounted 掛載結束狀態===============》');
            var state = {
                'el': this.$el,
                'data': this.$data,
                'message': this.message
            }
            console.log(this.$el);
            console.log(state);
        },
        beforeUpdate: function () {
            console.group('beforeUpdate 更新前狀態===============》');
            var state = {
                'el': this.$el,
                'data': this.$data,
                'message': this.message
            }
            console.log(this.$el);
            console.log(state);
            console.log('beforeUpdate == ' + document.getElementsByTagName('p')[0].innerHTML);
        },
        updated: function () {
            console.group('updated 更新完成狀態===============》');
            var state = {
                'el': this.$el,
                'data': this.$data,
                'message': this.message
            }
            console.log(this.$el);
            console.log(state);
            console.log('updated == ' + document.getElementsByTagName('p')[0].innerHTML);
        },
        beforeDestroy: function () {
            console.group('beforeDestroy 銷燬前狀態===============》');
            var state = {
                'el': this.$el,
                'data': this.$data,
                'message': this.message
            }
            console.log(this.$el);
            console.log(state);
        },
        destroyed: function () {
            console.group('destroyed 銷燬完成狀態===============》');
            var state = {
                'el': this.$el,
                'data': this.$data,
                'message': this.message
            }
            console.log(this.$el);
            console.log(state);
        },
        methods: {
            clickfun() {
                myVue.$destroy()
            }
        }    
    });
</script>
</html>

1. new vue() :這是new了一個vue的例項物件;此時就會進入元件的建立過程。

2. Init Events & Lifecycle :初始化元件的事件和生命週期函式;當執行完這一步之後,元件的生命週期函式就已經全部初始化好了,等待著依次去呼叫。

3. beforeCreate

官方說明:在例項初始化之後,資料觀測(data observer) 和 event/watcher 事件配置之前被呼叫。

解釋:這是第一個生命週期函式;此時,元件的data和methods以及頁面DOM結構,都還沒有初始化;所以此階段,什麼都做不了。

4. Init injections & reactivity

:這個階段中,正在初始化data和methods中的資料以及方法。

5. created

官方說明:例項已經建立完成之後被呼叫。在這一步,例項已完成以下的配置:資料觀測(data observer),屬性和方法的運算, watch/event 事件回撥。然而,掛載階段還沒開始,$el 屬性目前不可見。

解釋:這個元件建立階段第二個生命週期函式,此時,元件的data和methods已經可以用了;但是頁面還沒有渲染出來;在這個生命週期函式中,我們經常會發起Ajax請求;

6.正在解析模板結構,把data上的資料拿到,並且解析執行模板結構彙總的指令;當所有指令被解析完畢,那麼模板頁面就被渲染到記憶體中了;當模板編譯完成,我們的模板頁面,還沒有掛載到頁面上,只是存在於記憶體中,使用者看不到頁面;

7. beforeMount

官方說明:在掛載開始之前被呼叫:相關的 render 函式首次被呼叫。

解釋:當模板在記憶體中編譯完成,會立即執行例項建立階段的第三個生命週期函式,這個函式就是beforeMount,此時記憶體中的模板結構,還沒有真正渲染到頁面上;此時,頁面上看不到真實的資料,使用者看到的只是一個模板頁面而已;

8.這一步把正在記憶體中渲染好的模板結構替換到頁面上;

9. mounted

官方說明:el 被新建立的 vm.$el 替換,並掛載到例項上去之後呼叫該鉤子。如果 root 例項掛載了一個文件內元素,當 mounted 被呼叫時 vm.$el 也在文件內。 

解釋:mounted是元件建立階段最後的一個生命週期函式;此時,頁面已經真正的渲染好了,使用者可以看到真實的頁面資料了;當這個生命週期函式執行完,元件就離開了建立階段,進入到了執行中的階段;如果大家使用到一些第三方的UI外掛,而且這個外掛還需要被初始化,那麼,必須在mounted中來初始化外掛;

10.元件執行彙總的生命週期函式;元件執行中的生命週期函式,會根據data資料的變化,有選擇性的被觸發0次貨N次;

11. beforeUpdate

官方說明:資料更新時呼叫,發生在虛擬 DOM 重新渲染和打補丁之前。你可以在這個鉤子中進一步地更改狀態,這不會觸發附加的重渲染過程。

解釋:在執行beforeUpdate執行中的生命週期函式的時候,資料肯定是最新的;但是頁面上呈現的資料還是舊的;

12.正在根據最新的data資料,重新渲染記憶體中的的模板結構;並把渲染好的模板結構替換到頁面上

13. updated

官方說明:由於資料更改導致的虛擬 DOM 重新渲染和打補丁,在這之後會呼叫該鉤子。當這個鉤子被呼叫時,元件 DOM 已經更新,所以你現在可以執行依賴於 DOM 的操作。

解釋:頁面也完成了更新,此時,data資料是最新的,同時,頁面上呈現的資料也只最新的;

14. beforeDestroy

官方說明:例項銷燬之前呼叫。在這一步,例項仍然完全可用。

解釋:當執行beforeDestroy的時候,元件即將被銷燬,但是還沒有真正開始銷燬,此時元件還是正常可用的;data、methods等資料或方法,依舊可以被正常訪問;

15.銷燬過程

16. destroyed

官方說明:vue 例項銷燬後呼叫。呼叫後,Vue 例項指示的所有東西都會解繫結,所有的事件監聽器會被移除,所有的子例項也會被銷燬。

解釋:元件已完成了銷燬,元件無法使用,data和methods都不可使用。

參考:https://www.cnblogs.com/qidh/p/11431998.html