生命周期钩子
每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板,挂载实例到 DOM 以及数据改变时更新 DOM。在此过程中,它也会运行称为生命周期钩子的函数,让开发者有机会在特定阶段添加自己的代码。
生命周期图示

组合式 API
组合式 API 生命周期钩子:
onBeforeMount():在组件被挂载之前,调用。当这个钩子被调用时,组件已经完成了其响应式状态的设置,但还没有创建 DOM 节点。它即将首次执行 DOM 渲染过程。这个钩子在服务器端渲染期间不会被调用。onMounted():在组件挂载完成后,调用。组件在以下情况下被视为已挂载:其所有同步子组件都已经被挂载(不包含异步组件或<Suspense>的组件)。其自身的 DOM 树已经创建完成并插入了父容器中。注意仅当根容器在文档中时,才可以保证组件 DOM 树也在文档中。这个钩子在服务器端渲染期间不会被调用。onBeforeUpdate():由于响应式状态更改,在组件即将更新其 DOM 树之前,调用。这个钩子可以用来在 Vue 更新 DOM 之前访问 DOM 状态。在这个钩子中更改状态也是安全的。这个钩子在服务器端渲染期间不会被调用。onUpdated():由于响应式状态更改,在组件更新其 DOM 树之后,调用。父组件的更新钩子将在其子组件的更新钩子之后调用。这个钩子会在组件的任意 DOM 更新后被调用,这些更新可能是由不同的状态变更导致的。onBeforeUnmount():在卸载组件实例之前,调用。当这个钩子被调用时,组件实例依然还保有全部的功能。这个钩子在服务器端渲染期间不会被调用。onUnmounted():在卸载组件实例之后,调用。一个组件在以下情况下被视为已卸载:其所有子组件都已经被卸载。所有相关的响应式作用(渲染作用以及 setup()时创建的计算属性和侦听器)都已经停止。可以在这个钩子中手动清理一些副作用,例如计时器、DOM 事件监听器或者与服务器的连接。这个钩子在服务器端渲染期间不会被调用。
onActivated():若组件实例是<KeepAlive>缓存树的一部分,当组件被插入到 DOM 中时,调用。这个钩子在服务器端渲染期间不会被调用。onDeactivated():若组件实例是<KeepAlive>缓存树的一部分,当组件从 DOM 中被移除时,调用。这个钩子在服务器端渲染期间不会被调用。
onServerPrefetch():在组件实例在服务器上被渲染之前,调用。如果这个钩子返回了一个 Promise,服务端渲染会在渲染该组件前等待该 Promise 完成。这个钩子仅会在服务端渲染中执行,可以用于执行一些仅存在于服务端的数据抓取过程。
onErrorCaptured():在捕获到后代组件传递的错误时,调用。错误可以从以下几个来源中捕获:组件渲染、事件处理器、生命周期钩子、setup()函数、侦听器、自定义指令钩子、过渡钩子。onRenderTracked():调试钩子。当组件渲染过程中追踪到响应式依赖时,调用。这个钩子仅在开发模式下可用,且在服务器端渲染期间不会被调用。onRenderTriggered():调试钩子。当响应式依赖的变更触发了组件渲染时,调用。这个钩子仅在开发模式下可用,且在服务器端渲染期间不会被调用。
注册周期钩子
举个例子,onMounted钩子,可以用来在组件完成初始渲染并创建 DOM 节点后运行代码。
<script setup>
import { onMounted } from 'vue'
onMounted(() => {
console.log(`the component is now mounted.`)
})
</script>
还有其他一些钩子,会在实例生命周期的不同阶段被调用,最常用的是onMounted,onUpdated和onUnmounted。
当调用onMounted时,Vue 会自动将回调函数注册到当前正被初始化的组件实例上。这意味着这些钩子应当在组件初始化时被同步注册。例如,请不要这样做:
setTimeout(() => {
onMounted(() => {
// 这将不会正常工作
})
}, 100)
请注意,这并不意味着对onMounted的调用必须放在setup()或<script setup>内的词法环境下。onMounted()也可以在一个外部函数中调用,只要调用栈是同步的,且最终起源自setup()。
选项式 API
选项式 API 生命周期钩子:
beforeCreate:在实例初始化完成、props解析之后,在处理与状态相关的选项之前,调用。(与状态相关的选项:例如data()、computed())。created:在组件实例处理完所有与状态相关的选项后调用。当这个钩子被调用时,以下内容已经设置完成:响应式数据data()、计算属性computed()、方法methods:{}和侦听器watch()。但是,安装阶段尚未开始,该$el属性将不可用。beforeMount():在组件被挂载之前,调用。当这个钩子被调用时,组件已经完成了其响应式状态的设置,但还没有创建 DOM 节点。它即将首次执行 DOM 渲染过程。这个钩子在服务器端渲染期间不会被调用。mounted():在组件挂载完成后,调用。组件在以下情况下被视为已挂载:其所有同步子组件都已经被挂载(不包含异步组件或<Suspense>的组件)。其自身的 DOM 树已经创建完成并插入了父容器中。注意仅当根容器在文档中时,才可以保证组件 DOM 树也在文档中。这个钩子在服务器端渲染期间不会被调用。beforeUpdate():由于响应式状态更改,在组件即将更新其 DOM 树之前,调用。这个钩子可以用来在 Vue 更新 DOM 之前访问 DOM 状态。在这个钩子中更改状态也是安全的。这个钩子在服务器端渲染期间不会被调用。updated():由于响应式状态更改,在组件更新其 DOM 树之后,调用。父组件的更新钩子将在其子组件的更新钩子之后调用。这个钩子会在组件的任意 DOM 更新后被调用,这些更新可能是由不同的状态变更导致的。beforeUnmount():在卸载组件实例之前,调用。当这个钩子被调用时,组件实例依然还保有全部的功能。这个钩子在服务器端渲染期间不会被调用。unmounted():在卸载组件实例之后,调用。一个组件在以下情况下被视为已卸载:其所有子组件都已经被卸载。所有相关的响应式作用(渲染作用以及 setup()时创建的计算属性和侦听器)都已经停止。可以在这个钩子中手动清理一些副作用,例如计时器、DOM 事件监听器或者与服务器的连接。这个钩子在服务器端渲染期间不会被调用。
activated():若组件实例是<KeepAlive>缓存树的一部分,当组件被插入到 DOM 中时,调用。这个钩子在服务器端渲染期间不会被调用。deactivated():若组件实例是<KeepAlive>缓存树的一部分,当组件从 DOM 中被移除时,调用。这个钩子在服务器端渲染期间不会被调用。
serverPrefetch():在组件实例在服务器上被渲染之前,调用。如果这个钩子返回了一个 Promise,服务端渲染会在渲染该组件前等待该 Promise 完成。这个钩子仅会在服务端渲染中执行,可以用于执行一些仅存在于服务端的数据抓取过程。
注册周期钩子
举个例子,mounted钩子可以用来在组件完成初始渲染并创建 DOM 节点后运行代码。
export default {
mounted() {
console.log(`the component is now mounted.`)
}
}
还有其他一些钩子,会在实例生命周期的不同阶段被调用,最常用的是mounted,updated和unmounted。
所有生命周期钩子函数的this,上下文都会自动指向当前调用它的组件实例。注意:避免用箭头函数来定义生命周期钩子,因为如果这样的话,你将无法在函数中,通过this获取组件实例。
