帶你一文了解Vue生命周期鉤子
前言
和其他框架一樣,Vue 有許多生命周期鉤子,它們?cè)试S將代碼附加到在創(chuàng)建或使用 Vue 應(yīng)用程序時(shí)發(fā)生的特定事件,如當(dāng)組件加載時(shí)、當(dāng)組件被添加到 DOM 時(shí)或者當(dāng)某些東西被刪除時(shí)。
Vue 有很多生命周期鉤子,令人困惑的是每個(gè)鉤子的含義或作用。在本指南中,將介紹每個(gè)生命周期掛鉤的作用以及如何使用它們。
生命周期鉤子
Vue 在生命周期鉤子方面有兩種范式。一種是 Vue3 中引入的組合式API(Composition API),另一種是Vue2 中選項(xiàng)式API(Options API) ,它是定義 Vue 組件的原型模式。在本指南中,將從選項(xiàng)式API(Options API)開始,然后以此為基礎(chǔ)來(lái)展示組合式API(Composition API)中的工作原理。
選項(xiàng)式API(Options API)
選項(xiàng)式API(Options API)是 Vue2 的范式,如下代碼所示:
export default { name: "DevPoint", data() { return { phoneNumber: "13566666666", }; }, mounted() {}, };
生命周期流程圖
要了解每個(gè)生命周期掛鉤何時(shí)觸發(fā),下圖描述了每個(gè)生命周期掛鉤何時(shí)觸發(fā)。
運(yùn)行生命周期掛鉤
要使用選項(xiàng)式API(Options API)運(yùn)行任何生命周期掛鉤,可以將其添加到 Javascript 原型中。例如,如果使用 beforeCreate()
,在檢測(cè)到新組件后觸發(fā)的第一個(gè)鉤子,可以像這樣添加它:
export default { name: "DevPoint", data() { return { someData: "20220609", }; }, mounted() {}, };
上面已經(jīng)展示了不同鉤子發(fā)生的時(shí)機(jī),接下來(lái)介紹各個(gè)鉤子各自做了什么,具體什么情況下觸發(fā)。
beforeCreate()
在組件初始化時(shí)調(diào)用,data()
和 computed
屬性此時(shí)不可用。它對(duì)于調(diào)用不操作組件數(shù)據(jù)的 API 非常有用。如果 data()
在這個(gè)鉤子里面更新,一旦選項(xiàng)式API(Options API)加載完,更新將會(huì)將會(huì)丟失,變得無(wú)效。
created()
在實(shí)例處理完所有狀態(tài)操作后調(diào)用,可以訪問響應(yīng)式數(shù)據(jù)、computed
屬性、methods
和 watch
。$el
是 Vue 存儲(chǔ)組件 HTML 的變量,在這個(gè)鉤子中還不可用,因?yàn)榇藭r(shí)還沒有創(chuàng)建 DOM 元素。如果需要觸發(fā) API 等不操作DOM元素的操作或者更新 data()
則可以在這里進(jìn)行。
beforeMount()
這個(gè)鉤子在渲染發(fā)生之前會(huì)被執(zhí)行。模板已編譯,因此它存儲(chǔ)在內(nèi)存中,但尚未附加到頁(yè)面,尚未創(chuàng)建任何 DOM 元素,因此 $el
在這個(gè)階段仍然不可用。
mounted()
組件已安裝并顯示在頁(yè)面上, $el
可被正常使用,在此階段可以從 Vue 訪問和操作 DOM。這只會(huì)在所有子組件完全安裝后觸發(fā)。當(dāng)想在 DOM 加載后對(duì)其執(zhí)行某些操作時(shí),使用它很有用,比如可能更改其中的特定元素。
beforeUpdate()
有時(shí),會(huì)通過在watch
中更新數(shù)據(jù)或通過用戶交互來(lái)更改 Vue 組件中的數(shù)據(jù)。當(dāng)更改 data()
或?qū)е陆M件重新渲染時(shí),將觸發(fā)更新事件。在DOM重新渲染發(fā)生之前,beforeUpdate()
將立即觸發(fā)。在此事件之后,組件將重新渲染并使用最新數(shù)據(jù)進(jìn)行更新??梢允褂眠@個(gè)鉤子來(lái)訪問 DOM 的當(dāng)前狀態(tài),甚至可以更新 data()
。
updated()
觸發(fā)更新后,并且 DOM 已更新以最新數(shù)據(jù)重新渲染后,updated()
將觸發(fā)。這是在重新渲染后立即發(fā)生。現(xiàn)在,如果訪問$el
DOM 內(nèi)容或其他任何有關(guān) DOM 內(nèi)容的內(nèi)容,它將顯示新的、重新渲染后的版本。如果有父組件,updated()
則首先調(diào)用子組件,然后調(diào)用父 updated()
掛鉤。
beforeUnmount()
如果一個(gè)組件被移除,那么它就會(huì)被卸載。在組件被完全移除之前,beforeUnmount()
觸發(fā)。此事件仍然可以訪問 DOM 元素以及與組件有關(guān)的任何其他內(nèi)容。這在刪除事件中很有用,例如,可以使用此事件通知服務(wù)器用戶已刪除表中的節(jié)點(diǎn)。如果需要使用它們,仍然可以訪問 this.$el
,以及 data()
、methods
和 watch
。
unmount()
一旦完全刪除,unmount()
事件就會(huì)觸發(fā)。這可用于清理其他數(shù)據(jù)或事件偵聽器或定時(shí)器,以讓知道該組件不再存在于頁(yè)面上。如果需要使用它們,仍然可以訪問訪問 this.$el
,以及 data()
、methods
和 watch
。
組合式API(Composition API)中的生命周期鉤子
如果習(xí)慣使用選項(xiàng)式API(Options API),上面的鉤子會(huì)很有意義。如果主要使用 Vue 3,則需要習(xí)慣使用組合式API(Composition API)的風(fēng)格。組合式API(Composition API)是 選項(xiàng)式API(Options API) 的補(bǔ)充,但使用鉤子的方式略有不同。
setup() 替換 created() 和 beforeCreated()
在組合式API(Composition API)中,created()
和 beforeCreated()
不可訪問。被替換為 setup()
,在 created()
和 beforeCreated()
實(shí)現(xiàn)的邏輯完全可以遷移到 setup()
中。
鉤子可以與 setup() 一起使用
Hooks 可以與 setup()
一起使用,如下:
export default { name: "DevPoint", data() { return { someData: "20220609", }; }, setup() { console.log("setup"); }, mounted() { console.log(this.$el); }, };
但是,可能會(huì)看到這樣做的另一種方式是使用組合式 API 函數(shù)在 setup()
函數(shù)中定義掛鉤,如果需要這樣做,鉤子的命名會(huì)略有不同:
beforeMount()
改為onBeforeMount()
mounted()
改為onMounted()
beforeUpdate()
改為onBeforeUpdate()
updated()
改為onUpdated()
beforeUnmount()
改為onBeforeUnmount()
unmounted()
改為onUnmounted()
這些函數(shù)的作用與前面介紹描述的完全相同,但調(diào)用方式略有不同。所有這些鉤子都必須在 setup()
函數(shù)或設(shè)置腳本中調(diào)用。例如,必須在 setup
函數(shù)中運(yùn)行鉤子,如下所示:
export default { setup() { // 所有鉤子的邏輯代碼在這里 }, };
或者如下:
<script setup> // 所有鉤子的邏輯代碼在這里 </script>
因此,如果想使用這種方法調(diào)用鉤子,大概代碼如下:
<script> export default { setup() { // 所有鉤子邏輯 onBeforeMount(() => { // beforeMount() 邏輯 }); onBeforeUpdate(() => { // beforeUpdate() 邏輯 }); }, }; </script>
總結(jié)
Vue 生命周期相當(dāng)復(fù)雜,但它為前端開發(fā)提供了很多工具來(lái)運(yùn)行代碼、更新數(shù)據(jù)并確保組件以想要的方式顯示。
到此這篇關(guān)于Vue生命周期鉤子的文章就介紹到這了,更多相關(guān)Vue生命周期鉤子內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue 實(shí)現(xiàn)登錄界面驗(yàn)證碼功能
本文通過實(shí)例代碼給大家介紹了Vue 實(shí)現(xiàn)登錄界面 驗(yàn)證碼功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01Vuex報(bào)錯(cuò)之[vuex] unknown mutation type: han
這篇文章主要介紹了Vuex報(bào)錯(cuò)之[vuex] unknown mutation type: handlePower問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07vue自定義tap指令及tap事件的實(shí)現(xiàn)
Vue提供自定義實(shí)現(xiàn)指令的功能, 和組件類似,可以是全局指令和局部指令,這篇文章主要介紹了vue自定義tap指令及tap事件的實(shí)現(xiàn) ,需要的朋友可以參考下2018-09-09vue2.0項(xiàng)目中使用Ueditor富文本編輯器示例代碼
本篇文章主要介紹了vue2.0項(xiàng)目中使用Ueditor富文本編輯器示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08vue 組件內(nèi)獲取actions的response方式
今天小編就為大家分享一篇vue 組件內(nèi)獲取actions的response方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-11-11vue攔截器Vue.http.interceptors.push使用詳解
這篇文章主要為大家詳細(xì)介紹了vue攔截器Vue.http.interceptors.push的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04