帶你一文瞭解Vue生命周期鉤子
前言
和其他框架一樣,Vue 有許多生命周期鉤子,它們允許將代碼附加到在創建或使用 Vue 應用程序時發生的特定事件,如當組件加載時、當組件被添加到 DOM 時或者當某些東西被刪除時。
Vue 有很多生命周期鉤子,令人困惑的是每個鉤子的含義或作用。在本指南中,將介紹每個生命周期掛鉤的作用以及如何使用它們。
生命周期鉤子
Vue 在生命周期鉤子方面有兩種范式。一種是 Vue3 中引入的組合式API(Composition API),另一種是Vue2 中選項式API(Options API) ,它是定義 Vue 組件的原型模式。在本指南中,將從選項式API(Options API)開始,然後以此為基礎來展示組合式API(Composition API)中的工作原理。
選項式API(Options API)
選項式API(Options API)是 Vue2 的范式,如下代碼所示:
export default { name: "DevPoint", data() { return { phoneNumber: "13566666666", }; }, mounted() {}, };
生命周期流程圖
要瞭解每個生命周期掛鉤何時觸發,下圖描述瞭每個生命周期掛鉤何時觸發。
運行生命周期掛鉤
要使用選項式API(Options API)運行任何生命周期掛鉤,可以將其添加到 Javascript 原型中。例如,如果使用 beforeCreate()
,在檢測到新組件後觸發的第一個鉤子,可以像這樣添加它:
export default { name: "DevPoint", data() { return { someData: "20220609", }; }, mounted() {}, };
上面已經展示瞭不同鉤子發生的時機,接下來介紹各個鉤子各自做瞭什麼,具體什麼情況下觸發。
beforeCreate()
在組件初始化時調用,data()
和 computed
屬性此時不可用。它對於調用不操作組件數據的 API 非常有用。如果 data()
在這個鉤子裡面更新,一旦選項式API(Options API)加載完,更新將會將會丟失,變得無效。
created()
在實例處理完所有狀態操作後調用,可以訪問響應式數據、computed
屬性、methods
和 watch
。$el
是 Vue 存儲組件 HTML 的變量,在這個鉤子中還不可用,因為此時還沒有創建 DOM 元素。如果需要觸發 API 等不操作DOM元素的操作或者更新 data()
則可以在這裡進行。
beforeMount()
這個鉤子在渲染發生之前會被執行。模板已編譯,因此它存儲在內存中,但尚未附加到頁面,尚未創建任何 DOM 元素,因此 $el
在這個階段仍然不可用。
mounted()
組件已安裝並顯示在頁面上, $el
可被正常使用,在此階段可以從 Vue 訪問和操作 DOM。這隻會在所有子組件完全安裝後觸發。當想在 DOM 加載後對其執行某些操作時,使用它很有用,比如可能更改其中的特定元素。
beforeUpdate()
有時,會通過在watch
中更新數據或通過用戶交互來更改 Vue 組件中的數據。當更改 data()
或導致組件重新渲染時,將觸發更新事件。在DOM重新渲染發生之前,beforeUpdate()
將立即觸發。在此事件之後,組件將重新渲染並使用最新數據進行更新。可以使用這個鉤子來訪問 DOM 的當前狀態,甚至可以更新 data()
。
updated()
觸發更新後,並且 DOM 已更新以最新數據重新渲染後,updated()
將觸發。這是在重新渲染後立即發生。現在,如果訪問$el
DOM 內容或其他任何有關 DOM 內容的內容,它將顯示新的、重新渲染後的版本。如果有父組件,updated()
則首先調用子組件,然後調用父 updated()
掛鉤。
beforeUnmount()
如果一個組件被移除,那麼它就會被卸載。在組件被完全移除之前,beforeUnmount()
觸發。此事件仍然可以訪問 DOM 元素以及與組件有關的任何其他內容。這在刪除事件中很有用,例如,可以使用此事件通知服務器用戶已刪除表中的節點。如果需要使用它們,仍然可以訪問 this.$el
,以及 data()
、methods
和 watch
。
unmount()
一旦完全刪除,unmount()
事件就會觸發。這可用於清理其他數據或事件偵聽器或定時器,以讓知道該組件不再存在於頁面上。如果需要使用它們,仍然可以訪問訪問 this.$el
,以及 data()
、methods
和 watch
。
組合式API(Composition API)中的生命周期鉤子
如果習慣使用選項式API(Options API),上面的鉤子會很有意義。如果主要使用 Vue 3,則需要習慣使用組合式API(Composition API)的風格。組合式API(Composition API)是 選項式API(Options API) 的補充,但使用鉤子的方式略有不同。
setup() 替換 created() 和 beforeCreated()
在組合式API(Composition API)中,created()
和 beforeCreated()
不可訪問。被替換為 setup()
,在 created()
和 beforeCreated()
實現的邏輯完全可以遷移到 setup()
中。
鉤子可以與 setup() 一起使用
Hooks 可以與 setup()
一起使用,如下:
export default { name: "DevPoint", data() { return { someData: "20220609", }; }, setup() { console.log("setup"); }, mounted() { console.log(this.$el); }, };
但是,可能會看到這樣做的另一種方式是使用組合式 API 函數在 setup()
函數中定義掛鉤,如果需要這樣做,鉤子的命名會略有不同:
beforeMount()
改為onBeforeMount()
mounted()
改為onMounted()
beforeUpdate()
改為onBeforeUpdate()
updated()
改為onUpdated()
beforeUnmount()
改為onBeforeUnmount()
unmounted()
改為onUnmounted()
這些函數的作用與前面介紹描述的完全相同,但調用方式略有不同。所有這些鉤子都必須在 setup()
函數或設置腳本中調用。例如,必須在 setup
函數中運行鉤子,如下所示:
export default { setup() { // 所有鉤子的邏輯代碼在這裡 }, };
或者如下:
<script setup> // 所有鉤子的邏輯代碼在這裡 </script>
因此,如果想使用這種方法調用鉤子,大概代碼如下:
<script> export default { setup() { // 所有鉤子邏輯 onBeforeMount(() => { // beforeMount() 邏輯 }); onBeforeUpdate(() => { // beforeUpdate() 邏輯 }); }, }; </script>
總結
Vue 生命周期相當復雜,但它為前端開發提供瞭很多工具來運行代碼、更新數據並確保組件以想要的方式顯示。
到此這篇關於Vue生命周期鉤子的文章就介紹到這瞭,更多相關Vue生命周期鉤子內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!