-
掛載(初始化相關屬性,例如
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生命周期內容,如果有哪里寫錯了,歡迎各位大佬指正,謝謝大家!