Vue2到Vue3你必知的生命周期鉤子函數,快速搞定Vue組件優化
Vue 3在生命周期鉤子函數的設計方面的目標之一是盡量減少組件狀態的管理,提高代碼的可讀性和模塊化。Vue 3 的生命周期主要圍繞著Composition API設計展開,這使得生命周期的使用更加靈活和直觀。而Vue 2在這方面的設計思想則是把不同階段所需的操作都分離出來方便維護和調試。
以下是Vue 2和 Vue 3 生命周期的對比及其詳細介紹:
一、 Vue 2 的生命周期鉤子函數
beforeCreate
在實例化之后、數據初始化之前被調用。此時模板已經編譯成了 render 函數并且創建了虛擬 DOM,但是還未完成注入 data 和 computed 屬性,也未執行方法或處理事件。因此,如果再 Vue 實例里需要自定義一些 property 屬性或者使用 $store 等全局變量,那么這個時機就非常適合,否則可能會報錯。
created
在實例化后數據初始化后被調用。在 created 階段,data 和 computed 已經被注入而 methods、watcher、events 等事件以及 template/render 函數都還沒發生過回調調用。 Vue 實例已經被完全渲染出來,DOM 也已經渲染好了,我們可以在這個階段綁定監聽器,但是只能對狀態做出反應,不能改變狀態。你的組件實例現在已經準備好了,可以被掛載到 DOM 樹上。
beforeMount
在掛載之前被調用 。當 Vue 實將要掛載到 DOM 時執行該方法。 在此階段,Vue 的 render 函數已經返回虛擬 DOM 并進行了 diff 算法計算,即將來會更新視圖的內容已被計算,但是尚未應用到視圖上。
mounted
當 Vue 實例掛載到 DOM 上后調用 。這說明現在真正的執行 DOM 和 Webpack 文件打包工作均完成,Vue插件安裝、數據依賴關系初始化等等也都已完成,因此可以進行一些需要操作 DOM 的任務。mounted 僅僅保證了在該鉤子函數中可以正常訪問 DOM 元素,所有的 Mounted 過程并不是一次性完全輸出,而是一個疊加效果:首先最開始的 mounted 先執行(包含其內部子組件),接著是子孫組件的 mounted。
beforeUpdate
在當前組件更新前被調用,即數據更新前 DOM 更新前。當數據改變導致模板重新渲染時,面向用戶的界面還沒有被更新,這時就會調用 beforeUpdate 鉤子。因為數據已經發生變化,但是頁面的數據并沒有變 (如果有修改數據的話,使用 $nextTick)。 可以通過在鉤子函數中對狀態的操作,從而讓狀態修改后立即生效,這樣做同樣是不推薦的。
updated
當前組件更新結束之后調用(即由于數據更新而觸發重新渲染過后)。這里就需要注意的是 updated 與 mounted 非常相似。不同在于 updated 是每次數據更新都會執行,而 mounted 只會執行一次。
activated
keep-alive 組件激活時調用。 activated 鉤子函數僅僅在使用 keep-alive 組件時才能被觸發。使用 keep-alive 包裹的組件在被銷毀時,其緩存的狀態會保存。當再次需要使用該組件時,緩存的狀態會恢復。這個時候 activated 就會被調用。
deactivated
keep-alive 組件停用時調用。 deactivated 不同 activated 一樣,deactivated 鉤子函數僅僅在使用 keep-alive 組件時才能被觸發。當 keep-alive 組件從文檔中移除并停用時,deactivated 就會被調用了。
beforeDestroy
在一個 Vue 實例銷毀之前調用。這個時候 Vue 組件實例完全可用,用戶界面依然可以互動。 beforeDestroy 發生時如有監聽器要指定清理工作,請務必在此時進行清理以避免內存溢出等問題的出現。
destroyed
在一個 Vue 實例銷毀之后調用。這個時候代表著組件已經完全的被銷毀,那么組件對象也就變得毫無價值。所有的事件監聽器、數據綁定和子組件也已經被移除了。
errorCaptured
當捕獲一個來自子孫組件的錯誤時會調用這個鉤子。用于統計錯誤、日志上報等收集異常信息。
二、Vue 3 的生命周期鉤子函數
Vue 3 在生命周期設計上擺脫了 Vue 2 的基于代碼順序的設計,轉而使用了基于 API 的逐步執行。
setup
組件選項中最先被執行的一個鉤子函數是 setup。在這個鉤子函數中可以設置 props、data、computed、methods 等函數或屬性,并且需要將這些函數或屬性暴露給模板中使用。setup 函數會在組件實例創建前執行,而這個函數所提供的所有屬性都會被視為響應式數據,也就是說,可以通過類似于 data 中所提供的語法去訪問和更新它們。
onBeforeMount
與 beforeMount 的作用一致,在組件即將被安裝時執行。
onMounted
與 mounted 的作用一致,在組件已經被安裝后立即執行。
onBeforeUpdate
與 beforeUpdate 的作用一致,在組件即將更新時執行。
onUpdated
與 updated 的作用一致,在 DOM 被更新同步后執行。
onErrorCaptured
與 errorCaptured 的作用一致,可以捕獲子孫組件拋出的錯誤并進行統計和上報。
onBeforeUnmount
與 beforeDestroy 的作用一致,在組件即將被卸載時執行。在這個階段內部狀態還是可用的。
onUnmounted
與 destroyed 的作一致,在組件已經被卸載并且其對應的視圖 DOM 已經被清空之后執行。
onRenderTracked
在 Vue 3 中新增了一個鉤子函數 onRenderTracked,可以用于捕獲組件渲染的過程中哪些數據被訪問,哪些數據被修改等。這對于診斷 Vue 應用的性能問題是非常有幫助的。
onRenderTriggered
與 onRenderTracked 功能相反, 它會在組件渲染的過程中,跟蹤是什么引起了渲染的。這個鉤子函數也可以用于優化組件渲染性能。
三、總結
Vue 3 的生命周期相較于 Vue 2 精簡、靈活性更高,通過 Composition API 將所有數據操作集中到 setup 選項中,代碼結構清晰,使得開發者可以更容易地按照需求組織代碼并快速迭代。此外,Vue 3 增加了幾個新的生命周期鉤子函數,如 onRenderTracked 和 onRenderTriggered,可以通過這些新的 API 更好地優化應程序性能問題。