用了很久的vue,可是生命週期鉤子基本上只用mounted
一個;今天翻閱文檔,發現最新的Vue(v2.6.10)彷佛與之前不同了(*/ω\*),再複習一遍這些知識。javascript
全部的生命週期鉤子自動綁定
this
上下文到實例中,所以你能夠訪問數據,對屬性和方法進行運算。
這意味着你不能使用箭頭函數來定義一個生命週期方法,這是由於箭頭函數綁定了父上下文,所以this
與你期待的Vue實例不一樣。html
在實例初始化以後,數據觀測(data observer)和event/watcher事件配置以前被調用。vue
在實例建立完成後被當即調用。在這一步,實例已完成如下的配置:數據觀測(data observer),屬性和方法的運算,watch/event事件回調。然而,掛載階段還沒開始,$el
屬性目前不可見。java
在掛載開始以前被調用:相關的render
函數首次被調用。git
該鉤子在服務器端渲染期間不被調用。github
el
被新建立的vm.$el
替換,並掛載到實例上去以後,調用該鉤子。若是root實例掛載了一個文檔內元素,當mounted
被調用時vm.$el
也在文檔內。服務器
該鉤子在服務器端渲染期間不被調用。app
注意mounted
不會承諾全部子組件也都被一塊兒掛載。若是你但願等到整個視圖都渲染完畢,能夠使用vm.$nextTick
:函數
mounted() { this.$nextTick(() => { // TODO }); }
數據更新時調用,發生在虛擬DOM打補丁以前。這裏適合在更新以前訪問現有DOM。好比手動移除已添加的事件監聽器。this
該鉤子在服務器端渲染期間不被調用,由於只有初次渲染會在服務端進行。
因爲數據更改致使的虛擬DOM從新渲染和打補丁,在這以後會調用該鉤子。
當這個鉤子被調用時,組件DOM已經更新,因此你如今能夠執行依賴於DOM的操做。然而在大多數狀況下,你應該避免在此期間更改狀態。若是要相應狀態改變,一般最好使用計算屬性或watcher取而代之。
注意updated
不會承諾全部子組件也都被一塊兒重繪。若是你但願等到整個視圖都重繪完畢,能夠使用vm.$nextTick
。
該鉤子在服務器端渲染期間不被調用。
keep-alive組件激活時調用。
該鉤子在服務器端渲染期間不被調用。
keep-alive組件停用時調用。
該鉤子在服務器端渲染期間不被調用。
實例銷燬以前調用。在這一步,實例仍然徹底可用。
該鉤子在服務器端渲染期間不被調用。
Vue實例銷燬後調用。調用後,Vue實例指示的全部東西都會解綁定,全部的事件監聽器會被移除,全部的子實例也會被銷燬。
該鉤子在服務器端渲染期間不被調用。
2.5.0+新增
(err: Error, vm: Component, info: string) => ?boolean
當捕獲一個來自子孫組件的錯誤時被調用。此鉤子會收到三個參數:錯誤對象、發生錯誤的組件實例以及一個包含錯誤來源信息的字符串。此鉤子能夠返回
false
以組織該錯誤繼續向上傳播。
能夠在此鉤子中修改組件的狀態。所以在模板或渲染函數中設置其它內容的短路條件很是重要 ,它能夠防止當一個錯誤被捕獲時該組件進入一個無限的渲染循環。
當errorCaptured
被觸發:
Vue.component('button-counter', { template: '<button @click="increment">{{ counter }}</button>', data: function () { return { counter: 0 } }, watch: { counter(v) { if (v % 2 !== 0) throw new Error('OMG!!!!'); } }, methods: { increment: function () { const step = 1; this.counter += step; this.$emit('increment', { count: step }); } } });
new Vue({ el: '#app', data() { return { total: 0, isShow: true } }, methods: { incrementTotal: function (data) { this.total += data.count; } }, errorCaptured(err, vm, info) { console.warn('errorCaptured'); console.log(err); console.log(vm); console.log(info); console.log(this); } });
當按鈕計數值不能被2整除時觸發錯誤:
config.errorHandler
被定義,全部的錯誤仍會發送它,所以這些錯誤仍然會向單一的分析服務的地方進行彙報。errorCaptured
鉤子,則它們將會被相同的錯誤逐個喚起。errorCaptured
鉤子自身拋出了一個錯誤,則這個新錯誤和本來被捕獲的錯誤都會發送給全局的`config.errorHandler
。errorCaptured
鉤子可以返回false
以阻止錯誤繼續向上傳播。本質上是說「這個錯誤已經被搞定了且應該被忽略」。它會阻止其餘任何會被這個錯誤喚起的errorCaptured
鉤子和全局的config.errorHandler
。The end... Last updated by: Jehorn, April 22, 2019, 10:33 AM
demo源碼