1. 程式人生 > 程式設計 >Vue生命週期介紹和鉤子函式詳解

Vue生命週期介紹和鉤子函式詳解

目錄
  • 生命週期介紹和鉤子函式
  • VUE生命週期鉤子
  • Vue生命週期簡介
  • create 和 mounted 相關
  • update 相關
  • destroy 相關
  • 總結

Vue生命週期介紹和鉤子函式

元件每個階段它的內部構造是不一樣的,所以一般特定的鉤子做特定的事,比如Ajax獲取資料就可以在mounted階段。從Vue例項被建立開始到該例項最終被銷燬的整個過程叫做VUE的生命週期,在這個生命週期內發生了下面的事情:從vue例項被建立開始,首先vue例項被建立,之後開始資料的初始化,編譯模板,掛載dom,渲染dom,更新物件屬性,渲染dom,解綁銷燬。

VUE生命週期鉤子

生命週期鉤子又被叫做生命週期時間,生命週期函式,生命週期鉤子就是vue生命週期中出發的各類事件,這些事件被稱為生命週期鉤子,在vue生命週期中,大部分分為四個階段,建立,掛在,更新,銷燬,這四個階段各自對應兩個生命週期鉤子

一、建立部分(create),就是vue例項被初始化,簡單的說就是我們在程式碼中進行了這個操作 var app = new Vue(),之後就進入的vue生命週期的建立階段。在建立階段中會有兩個提供給我們可的介面,分別是beforeCreate 和 created。 這兩個介面都是在建立階段觸發,但是兩個介面又有所不同,beforeCreate比created要先觸發,即vue例項初始化後,沒有進行資料讀取前就觸發,如果在此時進行讀取data中的資料就會提示unfined。 created 是在例項建立完成後再被呼叫,此時data中的資料已經寫入完成,但是還沒有進行dom的掛載,也就還沒有與頁面進行關聯,下面進入掛載階段。

二、掛載階段(mount),該階段就是將頁面中dom掛載到例項化後的vue物件上。簡單的說就是執行了 el: ‘#dom'。該階段同樣有兩個介面供我們進行程式設計,分別是 beforemount 和 mounted 。這兩個介面的主要區別在與以有沒有將dom掛載到例項物件上,beforemount 是在掛載之前觸發,僅對模板進行解析,如果此時輸出需要掛載的dom的innerHTML的話,會將模板原樣輸出,並沒有將資料進行渲染。 mounted 實在dom掛載之後,可以將data中的資料渲染的頁面上。該階段之後就進入更新階段。

三、更新階段(update),該階段是在頁面上的資料在第一次載入之後再次進行更新的時候。同樣對應兩個介面 beforeupdate 和 update。這兩個介面的差異主要在於有沒有對頁面dom進行渲染。在我們對data中的資料進行修改,且修改完成後觸發 beforeupdate ,此時data中的屬性值已經是修改完成的狀態,但是沒有對頁面的dom進行渲染。update 就是將資料渲染到頁面上。至此vue的生命週期已經進行到更新階段,在正常的使用中我們會多次的經常處於更新階段,對頁面的資料進行各種修改。但是為了滿足將不必要的事件關閉,釋放記憶體,就還需要銷燬階段。

四、銷燬階段(destory),在一個實列被銷燬後,該例項所繫結的所有事件都會失效,監聽器也會被移出。該階段對應兩個介面 beforeDestroy 和 destroy。deforeDestory是在例項需要被銷燬但是還沒有先回之前呼叫,此時該例項的的繫結的各類事件、監聽器仍然可用。 destroy是在例項銷燬後呼叫,此時該例項的所有東西都不能使用,但是頁面上的資料仍保持頁面最後一次渲染的資料。

Vue生命週期簡介

在這裡插入圖片描述

在這裡插入圖片描述

上面描述的幾個階段

使用程式碼觀察鉤子函式

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/" src="https://cdn.delivr.net/vue/2.1.3/vue.js"></script>
</head>
<body>
 <div id="app">
     <p>{{ message }}</p>
</div>
 <script type="text/script">
   var app = new Vue({
      el: '#app',data: {
          message : "xuxiao is boy" 
      },beforeCreate: function () {
                console.group('beforeCreate 建立前狀態===============》');
               console.log("%c%s","color:red","el     : " + this.$el); //undefined
               console.log("%c%s","data   : " + this.$data); //undefined 
               console.log("%c%s","message: " + this.message)  
        },created: function () {
            console.group('created 建立完畢狀態===============》');
            console.log("%c%s","data   : " + this.$data); //已被初始化 
               console.log("%c%s","message: " + this.message); //已被初始化
        },beforeMount: function () www.cppcns.com{
            console.group('beforeMount 掛載前狀態===============》');
            console.log("%c%s","el     : " + (twww.cppcns.comhis.$el)); //已被初始化
            console.log(this.$el);
               console.log("%c%s","data   : " + this.$data); //已被初始化  
               console.log("%c%s","message: " + this.message); //已被初始化  
        },mounted: function () {
            console.group('mounted 掛載結束狀態===============》');
            console.log("%c%s","el     : " + this.$el); //已被初始化
            console.log(this.$el);    
               console.log("%c%s","data   : " + this.$data); //已被初始化
               console.log("%c%s","message: " + this.message); //已被初始化 
        },beforeUpdate: function () {
            console.group('beforeUpdate 更新前狀態===============》');
            console.log("%c%s","el     : " + this.$el);
            console.log(this.$el);   
               console.log("%c%s","data   : " + this.$data); 
               console.log("%c%s","message: " + this.message); 
        },updated: function () {
            console.group('updated 更新完成狀態===============》');
            console.log("%c%s","el     : " + this.$el);
            console.log(this.$el); 
               console.log("%c%s",beforeDestroy: function () {
            console.group('beforeDestroy 銷燬前狀態===============》');
            console.log("%c%s","el     : " + this.$el);
            console.log(this.$el);    
               console.log("%c%s",destroyed: function () {
            console.group('destroyed 銷燬完成狀態===============》');
            console.log("%c%s","el     : " + this.$el);
            console.log(this.$el);  
               console.log("%c%s","data   : " + this.$data); 
               console.log("%c%s","message: " + this.message)
        }
    })
</script>
</body>
</html>

create 和 mounted 相關

beforecreated:el 和 data 並未初始化

created:完成了 data 資料的初始化,el沒有

beforeMount:完成了 el 和 data 初始化

mounted :完成掛載

另外在標紅處,我們能發現el還是 {{message}},這裡就是應用的 Virtual DOM(虛擬Dom)技術,先把坑佔住了。到後面mounted掛載的時候再把值渲染進去。

在這裡插入圖片描述

update 相關

在這裡插入圖片描述

destroy 相關

有關於銷燬,暫時還不是很清楚。我們在console裡執行下命令對 vue例項進行銷燬。銷燬完成後,我們再重新改變message的值,vue不再對此動作進行響應了。但是原先生成的dom元素還存在,可以這麼理解,執行了destroy操作,後續就不再受vue控制了。

在這裡插入圖片描述

總結

beforecreate : 舉個例子:可以在這加個loading事件

created :在這結束loading,還做一些初始化,實現函式自執行

mounted : 在這發起後端請求,拿回資料,配合路由鉤子做一些事情

beforeDestory: 你確認刪除XX嗎? destoryed :當前元件已被刪除,清空相關內容

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注我們的更多內容!