-
掛載(初始化相關屬性,例如
watch
屬性,method
屬性)-
beforeCreate
-
created
-
beforeMount
-
mounted
-
-
更新(元素或元件的變更操作)
-
beforeUpdate
-
updated
-
-
銷燬(銷燬相關屬性)
-
beforeDestroy
-
下面請看一張Vue生命程式圖(圖片可能有點大)
鉤子函式:
第一步:
created
: 在呼叫該方法之前,初始化會被使用到的狀態,狀態包括props
,methods
,data
,computed
,watch
.
而且會實現對data
中屬性的監聽,也就是在created
的時候資料已經和data
屬性進行了繫結。(放在data
中的屬性當值發生改變的時候,檢視也會改變)。同時也會對傳遞到元件中的資料進行校驗。
所以在執行created
的時候,所有的狀態都初始化完成,我們也完全可以在該階段傳送非同步的ajax
請求,獲取資料。
但是,在created
方法中,是無法獲取到對應的的$el
選項,也就是無法獲取
created() { console.log("created"); console.log("el===", this.$el);// undefined console.log("data==", this.$data);// 可以獲取資料 console.log("foo==", this.foo);//可以獲取資料 },
<script> const vm = new Vue({ // el: "#app", //去掉了el選項 data: { foo: "fooData", }, methods: { beforeCreate() { console.log("beforCreate"); }, created() { console.log("created"); console.log("el===", this.$el); console.log("data==", this.$data); console.log("foo==", this.foo); }, }); </script>
現在,我們不新增el
選項,但是手動執行vm.$mount(el)
<script> const vm = new Vue({ // el: "#app",//去掉了el選項 data: { foo: "fooData", }, methods: { beforeCreate() { console.log("beforCreate"); }, created() { console.log("created"); console.log("el===", this.$el); console.log("data==", this.$data); console.log("foo==", this.foo); }, }); vm.$mount("#app");//新增了$mount方法 </script>
第一:如果Vue
例項物件中有template
引數選項,則將其作為模板編譯成render
函式,來完成渲染。
第二:如果沒有template
引數選項,則將外部的HTML作
為模板編譯(template
),也就是說,template
引數選項的優先順序要比外部的HTML
高
函式(Vue
的編譯實際上就是指Vue
把模板編譯成render
在執行該鉤子函式的時候,虛擬`DOM`已經建立完成,馬上就要渲染了,在這裡可以更改`data`中的資料,不會觸發`updated`, 其實在`created`中也是可以更改資料,也不會觸發`updated`函式
測試程式碼如下:
beforeMount() { console.log("beforeMount"); console.log("beforeMount el===", this.$el); console.log("data==", this.$data); //this.foo = "abc"; //修改資料 console.log("foo==", this.foo); },
通過上面的程式碼,我們可以獲取`el`中的內容,同時也可以修改資料。
但是,這裡需要注意的輸入的`el`中的內容,`{{foo}}`還沒有被真正的資料替換掉。而且對應的內容還沒有掛載到頁面上。
下面執行了`Create VM.$el and replace "el" with it`
經過這一步後,在模板中所寫的`{{foo}}`會被具體的資料所替換掉。
所以下面執行`mounted`的時候,可以看到真實的資料。同時整個元件內容已經掛載到頁面中了,資料以及真實`DOM`都已經處理好了,可以在這裡操作真實`DOM`了,也就是在`mounted`的時候,頁面已經被渲染完畢了,在這個鉤子函式中,我們可以去傳送`ajax`請求。
第四步:如下圖
當整個元件掛在完成後,有可能會進行資料的修改,當Vue
發現data
中的資料發生了變化,會觸發對應元件的重新渲染,先後呼叫了beforeUpdate
和updated
鉤子函式。
在updated
之前beoreUpdate
之後有一個非常重要的操作就是虛擬DOM
會重新構建,也就是新構建的虛擬DOM
與上一次的虛擬DOM
樹利用diff
演算法進行對比之後重新渲染。
而到了updated
這個方法,就表示資料已經更新完成,dom
也重新render
在該方法中,可以做一些清理的工作,例如:清除定時器等。
但是執行到destroyed
鉤子函式的時候,Vue
beforeCreate( )// 該鉤子函式執行時,元件例項還未建立. created()//元件初始化完畢,各種資料可以使用,可以使用ajax傳送非同步請求獲取資料 beforeMounted()// 未執行渲染,更新,虛擬DOM完成,真實DOM未建立 mounted()// 初始化階段結束,真實DOM已經建立,可以傳送非同步請求獲取資料,也可以訪問dom元素 beforeUpdate()//更新前,可用於獲取更新前各種狀態資料 updated()//更新後執行該鉤子函式,所有的狀態資料是最新的。 beforeDestroy() // 銷燬前執行,可以用於一些定時器的清除。 destroyed()//元件已經銷燬,事件監聽器被移除,所有的子例項也會被銷燬。
以上為vue生命週期內容,如果有哪裡寫錯了,歡迎各位大佬指正,謝謝大家!