Vue生命週期鉤子

Vue生命週期鉤子

用了很久的vue,可是生命週期鉤子基本上只用mounted一個;今天翻閱文檔,發現最新的Vue(v2.6.10)彷佛與之前不同了(*/ω\*),再複習一遍這些知識。javascript

全部的生命週期鉤子自動綁定this上下文到實例中,所以你能夠訪問數據,對屬性和方法進行運算。
這意味着你不能使用箭頭函數來定義一個生命週期方法,這是由於箭頭函數綁定了父上下文,所以this與你期待的Vue實例不一樣。html

beforeCreate

在實例初始化以後,數據觀測(data observer)和event/watcher事件配置以前被調用。vue

created

在實例建立完成後被當即調用。在這一步,實例已完成如下的配置:數據觀測(data observer),屬性和方法的運算,watch/event事件回調。然而,掛載階段還沒開始,$el屬性目前不可見。java

beforeMount

在掛載開始以前被調用:相關的render函數首次被調用。git

該鉤子在服務器端渲染期間不被調用。github

mounted

el被新建立的vm.$el替換,並掛載到實例上去以後,調用該鉤子。若是root實例掛載了一個文檔內元素,當mounted被調用時vm.$el也在文檔內。服務器

該鉤子在服務器端渲染期間不被調用。app

注意mounted不會承諾全部子組件也都被一塊兒掛載。若是你但願等到整個視圖都渲染完畢,能夠使用vm.$nextTick函數

mounted() {
    this.$nextTick(() => {
        // TODO
    });
}
beforeUpdate

數據更新時調用,發生在虛擬DOM打補丁以前。這裏適合在更新以前訪問現有DOM。好比手動移除已添加的事件監聽器。this

該鉤子在服務器端渲染期間不被調用,由於只有初次渲染會在服務端進行。

updated

因爲數據更改致使的虛擬DOM從新渲染和打補丁,在這以後會調用該鉤子。

當這個鉤子被調用時,組件DOM已經更新,因此你如今能夠執行依賴於DOM的操做。然而在大多數狀況下,你應該避免在此期間更改狀態。若是要相應狀態改變,一般最好使用計算屬性或watcher取而代之。

注意updated不會承諾全部子組件也都被一塊兒重繪。若是你但願等到整個視圖都重繪完畢,能夠使用vm.$nextTick

該鉤子在服務器端渲染期間不被調用。

activated

keep-alive組件激活時調用。

該鉤子在服務器端渲染期間不被調用。

deactivated

keep-alive組件停用時調用。

該鉤子在服務器端渲染期間不被調用。

beforeDestroy

實例銷燬以前調用。在這一步,實例仍然徹底可用。

該鉤子在服務器端渲染期間不被調用。

destroyed

Vue實例銷燬後調用。調用後,Vue實例指示的全部東西都會解綁定,全部的事件監聽器會被移除,全部的子實例也會被銷燬。

該鉤子在服務器端渲染期間不被調用。

errorCaptured

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源碼

相關文章
相關標籤/搜索