在Vue.js中,生命周期指的是組件從創(chuàng)建到銷毀過程中,各個(gè)階段的鉤子函數(shù)(hooks)。這些鉤子函數(shù)允許你在組件的不同階段執(zhí)行代碼,例如組件的創(chuàng)建、掛載、更新、銷毀等。Vue提供了多個(gè)生命周期鉤子,使得開發(fā)者能夠在組件的生命周期的各個(gè)階段插入自定義邏輯。
以下是Vue 2.x中常見的生命周期鉤子:
創(chuàng)建階段:
beforeCreate:在實(shí)例初始化之后,數(shù)據(jù)觀測 (data observer) 和 event/watcher 事件配置之前被調(diào)用。
created:在實(shí)例創(chuàng)建完成后被立即調(diào)用,此時(shí)已完成數(shù)據(jù)觀測、屬性和方法的運(yùn)算,watch/event 事件回調(diào)還未綁定。
掛載階段:
beforeMount:在掛載開始之前被調(diào)用,相關(guān)的render函數(shù)首次被調(diào)用。該鉤子在生成真實(shí)的DOM之前被調(diào)用。
mounted:el 被新創(chuàng)建的 vm.$el 替換,并掛載到實(shí)例上去之后調(diào)用該鉤子。此時(shí),組件的模板已真實(shí)地被渲染成HTML,并且掛載到了DOM上。
更新階段:
beforeUpdate:數(shù)據(jù)更新時(shí)調(diào)用,發(fā)生在虛擬 DOM 打補(bǔ)丁之前。這里適合在更新之前訪問現(xiàn)有的 DOM,比如手動移除已添加的事件監(jiān)聽器。
updated:由于數(shù)據(jù)更改導(dǎo)致的虛擬 DOM 重新渲染和打補(bǔ)丁,在這之后會調(diào)用這個(gè)鉤子。當(dāng)這個(gè)鉤子被調(diào)用時(shí),組件 DOM 已經(jīng)更新,所以你現(xiàn)在可以執(zhí)行依賴于 DOM 的操作。然而在大多數(shù)情況下,你應(yīng)該避免在此階段更改狀態(tài),因?yàn)檫@可能會導(dǎo)致更新循環(huán)。
銷毀階段:
beforeDestroy:在實(shí)例銷毀之前調(diào)用。在這一步,實(shí)例仍然完全可用,this 仍能獲取到組件實(shí)例。
destroyed:Vue 實(shí)例銷毀后調(diào)用。調(diào)用后,Vue 實(shí)例指示的所有東西都會解綁定,所有的事件監(jiān)聽器會被移除,所有的子實(shí)例也會被銷毀。
在Vue 3.x中,除了上述的生命周期鉤子外,還引入了Composition API,這使得生命周期鉤子的使用方式略有不同:
創(chuàng)建階段:使用setup()函數(shù)代替了beforeCreate和created鉤子,因?yàn)閟etup()是組件創(chuàng)建時(shí)最先調(diào)用的。
掛載和更新:掛載和更新的生命周期鉤子名稱保持不變(如mounted, updated等),但它們現(xiàn)在是在setup()函數(shù)內(nèi)部通過調(diào)用Vue的響應(yīng)式API和生命周期函數(shù)來訪問的。例如,使用onMounted()來替代mounted鉤子。
銷毀階段:使用onBeforeUnmount和onUnmounted來替代beforeDestroy和destroyed。
例如,在Vue 3中,你可以這樣使用生命周期鉤子:
import { onMounted, onUnmounted } from 'vue'; export default { setup() { onMounted(() => { console.log('組件已掛載'); }); onUnmounted(() => { console.log('組件即將銷毀'); }); } }