前言
生命週期是理解Vue的一個非常重要的環節,初學Vue時可能會出現資料渲染的失敗的錯誤,因此打算寫兩篇部落格詳細介紹Vue的生命週期:
- 單個元件的Vue生命週期(本文)
- 多個元件的Vue生命週期
Vue生命週期
1.1 beforeCreate()
說明
在例項初始化之後,資料觀測 (data observer) 和 event/watcher 事件配置之前被呼叫;data、computed、watch、methods和DOM都不能使用
data () {
return {
msg: 1
}
},
beforeCreate() {
console.log(this.$data) //undefined
console.log(this.$el) //undefined
}
複製程式碼
注意
如果非要在beforeCreate()取data也不是沒有辦法,非同步方式可以通過this.$nextTick()或seTimeout
,同步方式可以通過this.$options
。當然一般不會這麼操作。
beforeCreate() {
this.$nextTick(() => {
console.log(this.msg) //1
})
setTimeout(()=> {
console.log(this.msg) //1
}, 1000)
console.log(this.$options.data()["msg"]) //1
}
複製程式碼
1.2 created()
說明
在例項建立完成後被立即呼叫,可以操作data、computed、watch、methods,但DOM還沒掛載,不能操作。
created () {
this.getMsg() //1
console.log(this.msg) //1
console.log(this.$el) //undefined
},
methods: {
getMsg() {
console.log(this.msg)
}
}
複製程式碼
通常在此進行頁面初始化操作或簡單的Ajax請求(此時頁面還未呈現,過多的請求會導致白屏)
1.3 beforeMount()
說明
在掛載開始之前被呼叫:相關的 render 函式首次被呼叫。這一步沒啥特別的,很少在此進行操作。
beforeMount() {
console.log(this.msg) //1
console.log(this.$el) //undefined
}
複製程式碼
1.4 mounted()
說明
例項被掛載到DOM上。通常用於執行Ajax請求。
mounted() {
console.log(this.msg) //1
console.log(this.$el) //可看到 DOM 的資訊
}
複製程式碼
注意
mounted 不保證所有子元件都一起被掛載了。若想要等整個檢視都渲染完畢再操作,可以使用 this.$nextTick
mounted() {
this.$nextTick()
}
複製程式碼
1.5 beforeUpdate()
只有資料更新時才呼叫,發生在虛擬 DOM 打補丁之前。適合在更新之前訪問現有的 DOM,比如手動移除已新增的事件監聽器。
<div>{{msg}}</div>
複製程式碼
mounted() {
this.msg = 2
},
beforeUpdate: function() {
console.log(this.$el.innerHTML) //1
console.log(this.$el) //<div ...> 2 </div>
console.log(this.msg) //2
}
複製程式碼
1.6 updated()
說明
虛擬 DOM 重新渲染和打補丁之後呼叫,元件DOM已經更新,可以執行依賴於DOM的操作。
mounted() {
this.msg = 2
},
updated: function() {
console.log(this.$el.innerHTML) //2
console.log(this.$el) //<div ...> 2 </div>
console.log(this.msg) //2
}
複製程式碼
注意
updated 不保證所有子元件都被重繪了。若想要等到整個檢視都重繪完畢再操作,可以用 this.$nextTick
1.7 beforeDestroy()
說明
例項銷燬前呼叫,這裡沒什麼特殊的,該用的仍然可用
beforeDestroy() {
console.log(this.msg) //2
console.log(this.$el) //<div ...> 2 </div>
}
複製程式碼
1.8 destroyed()
說明
Vue 例項銷燬後呼叫。呼叫後,Vue 例項指示的所有東西都會解繫結,所有的事件監聽器會被移除,所有的子例項也會被銷燬。
這裡我一開始的理解是資料不能用了,結果還依然列印了資料,不解中……
destroyed() {
console.log(this.msg) //2
console.log(this.$el) //<div ...> 2 </div>
}
複製程式碼
總結
Vue的生命週期可以總結為3個階段:
- 初始化階段(執行1次):beforeCreate、created、beforeMount、mounted
- 資料更新階段(執行多次):beforeUpdate、updated
- 銷燬階段/切換元件(執行1次):beforeDestory、destroyed
- 用得比較多的就是 created 和 mounted 了
參考
感謝看完的朋友點個贊,感謝鼓勵和支援!