一、生命周期的基礎知識
Vue.js 的組件實例有一個完整的生命周期,包含多個階段,每個階段都有一個相應的鉤子函數可以用於執行相應的操作。以下是 Vue.js 的生命周期圖示:
beforeCreate() {
// 在實例初始化之後,數據觀測(data observer)和 event/watcher 事件配置之前被調用。
},
created() {
// 在實例創建完成後被立即調用
},
beforeMount() {
// 在掛載開始之前被調用--即將模板編譯成虛擬 DOM,並在將其渲染到 DOM 之前執行。
},
mounted() {
// 實例掛載之後調用--將頁面渲染完畢;
},
beforeUpdate() {
// 數據更新時調用,但是並未渲染新數據,這裡適合拿舊數據和準備更新的數據做對比操作。
},
updated() {
// 在數據更新且模板重新渲染之後調用。
},
beforeDestroy() {
// 實例銷毀之前調用--可以在這裡進行解綁事件、銷毀定時器、取消監聽等等操作。
},
destroyed() {
// 實例銷毀之後調用--一般是清理計時器等東西。
}
總之,Vue.js 的生命周期分為 beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy 和 destroyed 等階段,每個階段都會有對應的鉤子函數。
二、生命周期詳解
1. beforeCreate 階段
顧名思義,beforeCreate 階段是在實例被創建之前調用的鉤子函數,此時實例還沒有被創建,所以也就無法訪問到 data 和 methods 等實例屬性。
beforeCreate() {
// 在實例被創建之前調用的鉤子函數,此時實例還沒有被創建,所以也就無法訪問到 data 和 methods 等實例屬性。
// 此時定義的 data 屬性、methods 等都不會生效。
}
2. created 階段
created 階段是在實例被創建之後調用的鉤子函數,此時已經可以訪問到 data 和 methods 等實例屬性,但尚未生成真正的 DOM。
created() {
// 在實例創建完成後被立即調用,此時已經可以訪問到 data 和 methods 等實例屬性,但尚未生成真正的 DOM。
// 比如可以在此時進行異步請求數據,操作數據等等。
}
3. beforeMount 階段
beforeMount 階段是在模板編譯成虛擬 DOM,並在將其渲染到 DOM 之前執行的鉤子函數,此時已經可以訪問到 DOM 樹,但是還沒有渲染出來。
beforeMount() {
// 此時已經可以訪問到 DOM 樹,但是還沒有渲染出來,可以在此時進行一些數據的處理和初始化操作,但是不要對已處理過的數據進行多次操作。
}
4. mounted 階段
mounted 階段是在模板被渲染成 DOM 之後調用的鉤子函數,此時組件已經渲染完畢,DOM 中元素已經可以被訪問到。
mounted() {
// 在模板被渲染成 DOM 之後調用,此時組件已經渲染完畢,DOM 中元素已經可以被訪問到,常見使用場景比如向後台請求數據渲染頁面,聲明周期後,訪問虛擬dom,可能需要等dom渲染完成才能訪問,
// 可通過 this.$nextTick() 等待模板渲染完畢之後執行操作。
}
5. beforeUpdate 階段
beforeUpdate 階段是在數據更新時調用的鉤子函數,但是此時並未渲染新數據,適合拿舊數據和準備更新的數據做對比操作。
beforeUpdate() {
// 數據更新時調用,但是並未渲染新數據,適合拿舊數據和準備更新的數據做對比操作。
// 也可以在此時對數據進行修改,但是應該避免無限更新。
}
6. updated 階段
updated 階段是在數據更新且模板重新渲染之後調用的鉤子函數,此時可以訪問新的 DOM 元素和更新之後的數據。
updated() {
// 在數據更新且模板重新渲染之後調用,可以訪問新的 DOM 元素和更新之後的數據,但應該避免使用無限循環的操作,以免影響性能。
}
7. beforeDestroy 階段
beforeDestroy 階段是在實例銷毀之前調用的鉤子函數,此時組件實例仍然可以訪問。
beforeDestroy() {
// 在實例銷毀之前調用,一般是解除事件監聽、定時器等等。
}
8. destroyed 階段
destroyed 階段是在實例銷毀之後調用的鉤子函數,此時組件實例已被完全銷毀。
destroyed() {
// 實例銷毀之後調用,一般用於清理計時器等。
}
三、生命周期常見錯誤的解決方案
1. created 階段使用 $refs
在 created 階段使用 $refs 來操作 DOM 元素會報錯,因為此時模板還未渲染成真正的 DOM,$refs 中並沒有對應的 DOM 元素。
解決方案:在 mounted 階段使用 $refs 操作 DOM 元素。
2. watch 與 computed 屬性
watch 和 computed 是 Vue.js 中的兩個重要的屬性。watch 屬性是用來監聽數據變化的,而 computed 屬性是用來計算數據的。在 watch 中計算數據或在 computed 中修改數據都是不允許的。
解決方案:在 computed 中計算數據,在 watch 中監聽數據變化。
3. destroyed 鉤子中的數據清理
在 destroyed 鉤子中進行數據清理時,因為此時組件已經銷毀,所以不能再訪問組件中的 data 屬性,清理操作也就無法進行。
解決方案一:在 beforeDestroy 鉤子中進行數據清理。
解決方案二:建議採用 aminated 和 transition 進行操作,對組件進行卸載切換時,即使在組件已經被銷毀的情況下,也可以通過 aminated 和 transition 組件實現一些操作。
四、總結
Vue.js 的生命周期是 Vue.js 組件中非常重要的一個部分。在 Vue.js 組件中,每個實例都有一個完整的生命周期,包含多個階段,每個階段都對應一個鉤子函數,可以在不同的階段中做出相應的操作。學好 Vue.js 的生命周期,可以更好地進行 Vue.js 應用程序的開發。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/186545.html