如下圖為Vue官網(https://cn.vuejs.org/v2/guide/instance.html#實例生命周期)給出的生命周期圖示
光看圖或許不夠直觀,接下來就是一段代碼來加強理解。
mounted方法及其之前
dom部分:
<div id="app"> <p>{{message}}</p> </div>
js部分:
<script> var app = new Vue({ el: '#app', data: { message : "some data" }, beforeCreate: function () { console.log('beforeCreate 創建前狀態===============》'); console.log("%c%s", "color:red" , "el : " + this.$el); console.log("%c%s", "color:red","data : " + this.$data); console.log("%c%s", "color:red","message: " + this.message) }, created: function () { console.log('created 創建完畢狀態===============》'); console.log("%c%s", "color:red","el : " + this.$el); console.log("%c%s", "color:red","data : " + this.$data); console.log("%c%s", "color:red","message: " + this.message); }, beforeMount: function () { console.log('beforeMount 掛載前狀態===============》'); console.log("%c%s", "color:red","el : " + (this.$el)); console.log(this.$el); console.log("%c%s", "color:red","data : " + this.$data); console.log("%c%s", "color:red","message: " + this.message); }, mounted: function () { console.log('mounted 掛載結束狀態===============》'); console.log("%c%s", "color:red","el : " + this.$el); console.log(this.$el); console.log("%c%s", "color:red","data : " + this.$data); console.log("%c%s", "color:red","message: " + this.message); }, beforeUpdate: function () { console.log('beforeUpdate 更新前狀態===============》'); console.log("%c%s", "color:red","el : " + this.$el); console.log(this.$el); console.log("%c%s", "color:red","data : " + this.$data); console.log("%c%s", "color:red","message: " + this.message); }, updated: function () { console.log('updated 更新完成狀態===============》'); console.log("%c%s", "color:red","el : " + this.$el); console.log(this.$el); console.log("%c%s", "color:red","data : " + this.$data); console.log("%c%s", "color:red","message: " + this.message); }, beforeDestroy: function () { console.log('beforeDestroy 銷毀前狀態===============》'); console.log("%c%s", "color:red","el : " + this.$el); console.log(this.$el); console.log("%c%s", "color:red","data : " + this.$data); console.log("%c%s", "color:red","message: " + this.message); }, destroyed: function () { console.log('destroyed 銷毀完成狀態===============》'); console.log("%c%s", "color:red","el : " + this.$el); console.log(this.$el); console.log("%c%s", "color:red","data : " + this.$data); console.log("%c%s", "color:red","message: " + this.message) } }) </script>
以上代碼的運行結果為:
從運行結果可以看出來:
在beforeCreated階段,vue實例的掛載元素$el和數據對象data都為undefined,還未初始化,
在created階段,vue實例的數據對象data有了,$el還沒有,
在beforeMount階段,vue實例的$el和data都初始化了,但還是掛載之前為虛擬的dom節點,data.message還未替換
在mounted階段,vue實例掛載完成,data.message成功渲染
update部分
在瀏覽器控制台中輸入 app.message = "new data",會出現如下變化
可以發現,當data變化時,會觸發beforeUpdate和updated方法
destroy部分
在瀏覽器控制台中輸入app.$destroy()
此時再繼續修改message的值,在瀏覽器控制台輸入app.message = "change after destory",你會發現:
因此,在執行destroy方法后,對data的改變不會再觸發周期函數,說明此時vue實例已經解除了事件監聽以及和dom的綁定,但是dom結構依然存在。