生命周期钩子 - onBeforeMount()、onMounted()、 onBeforeUpdate()、 onUpdated() - vue 基础
生命周期钩子
每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板,挂载实例到 DOM 以及数据改变时更新 DOM。在此过程中,它也会运行称为生命周期钩子的函数,让开发者有机会在特定阶段添加自己的代码。
生命周期图示
组合式 API
组合式 API 生命周期钩子:
onBeforeMount()
:在组件被挂载之前,调用。当这个钩子被调用时,组件已经完成了其响应式状态的设置,但还没有创建 DOM 节点。它即将首次执行 DOM 渲染过程。这个钩子在服务器端渲染期间不会被调用。onMounted()
:在组件挂载完成后,调用。组件在以下情况下被视为已挂载:其所有同步子组件都已经被挂载(不包含异步组件或的组件)。其自身的 DOM 树已经创建完成并插入了父容器中。注意仅当根容器在文档中时,才可以保证组件 DOM 树也在文档中。这个钩子在服务器端渲染期间不会被调用。onBeforeUpdate()
:由于响应式状态更改,在组件即将更新其 DOM 树之前,调用。这个钩子可以用来在 Vue 更新 DOM 之前访问 DOM 状态。在这个钩子中更改状态也是安全的。这个钩子在服务器端渲染期间不会被调用。onUpdated()
:由于响应式状态更改,在组件更新其 DOM 树之后,调用。父组件的更新钩子将在其子组件的更新钩子之后调用。这个钩子会在组件的任意 DOM 更新后被调用,这些更新可能是由不同的状态变更导致的。onBeforeUnmount()
:在卸载组件实例之前,调用。当这个钩子被调用时,组件实例依然还保有全部的功能。这个钩子在服务器端渲染期间不会被调用。onUnmounted()
:在卸载组件实例之后,调用。一个组件在以下情况下被视为已卸载:其所有子组件都已经被卸载。所有相关的响应式作用(渲染作用以及 setup()时创建的计算属性和侦听器)都已经停止。可以在这个钩子中手动清理一些副作用,例如计时器、DOM 事件监听器或者与服务器的连接。这个钩子在服务器端渲染期间不会被调用。
onActivated()
:若组件实例是缓存树的一部分,当组件被插入到 DOM 中时,调用。这个钩子在服务器端渲染期间不会被调用。
onDeactivated()
:若组件实例是缓存树的一部分,当组件从 DOM 中被移除时,调用。这个钩子在服务器端渲染期间不会被调用。
onServerPrefetch()
:在组件实例在服务器上被渲染之前,调用。如果这个钩子返回了一个 Promise,服务端渲染会在渲染该组件前等待该 Promise 完成。这个钩子仅会在服务端渲染中执行,可以用于执行一些仅存在于服务端的数据抓取过程。
onErrorCaptured()
:在捕获到后代组件传递的错误时,调用。错误可以从以下几个来源中捕获:组件渲染、事件处理器、生命周期钩子、setup()函数、侦听器、自定义指令钩子、过渡钩子。onRenderTracked()
:调试钩子。当组件渲染过程中追踪到响应式依赖时,调用。这个钩子仅在开发模式下可用,且在服务器端渲染期间不会被调用。onRenderTriggered()
:调试钩子。当响应式依赖的变更触发了组件渲染时,调用。这个钩子仅在开发模式下可用,且在服务器端渲染期间不会被调用。
注册周期钩子
举个例子,onMounted
钩子,可以用来在组件完成初始渲染并创建 DOM 节点后运行代码。
还有其他一些钩子,会在实例生命周期的不同阶段被调用,最常用的是onMounted
,onUpdated
和onUnmounted
。
当调用onMounted
时,Vue 会自动将回调函数注册到当前正被初始化的组件实例上。这意味着这些钩子应当在组件初始化时被同步注册。例如,请不要这样做:
setTimeout(() => { onMounted(() => { // 这将不会正常工作 }) }, 100)
请注意,这并不意味着对onMounted
的调用必须放在setup()
或内的词法环境下。
onMounted()
也可以在一个外部函数中调用,只要调用栈是同步的,且最终起源自setup()
。
选项式 API
选项式 API 生命周期钩子:
beforeCreate
:在实例初始化完成、props解析之后,在处理与状态相关的选项之前,调用。(与状态相关的选项:例如data()
、computed()
)。created
:在组件实例处理完所有与状态相关的选项后调用。当这个钩子被调用时,以下内容已经设置完成:响应式数据data()
、计算属性computed()
、方法methods:{}
和侦听器watch()
。但是,安装阶段尚未开始,该$el属性将不可用。beforeMount()
:在组件被挂载之前,调用。当这个钩子被调用时,组件已经完成了其响应式状态的设置,但还没有创建 DOM 节点。它即将首次执行 DOM 渲染过程。这个钩子在服务器端渲染期间不会被调用。mounted()
:在组件挂载完成后,调用。组件在以下情况下被视为已挂载:其所有同步子组件都已经被挂载(不包含异步组件或的组件)。其自身的 DOM 树已经创建完成并插入了父容器中。注意仅当根容器在文档中时,才可以保证组件 DOM 树也在文档中。这个钩子在服务器端渲染期间不会被调用。beforeUpdate()
:由于响应式状态更改,在组件即将更新其 DOM 树之前,调用。这个钩子可以用来在 Vue 更新 DOM 之前访问 DOM 状态。在这个钩子中更改状态也是安全的。这个钩子在服务器端渲染期间不会被调用。updated()
:由于响应式状态更改,在组件更新其 DOM 树之后,调用。父组件的更新钩子将在其子组件的更新钩子之后调用。这个钩子会在组件的任意 DOM 更新后被调用,这些更新可能是由不同的状态变更导致的。beforeUnmount()
:在卸载组件实例之前,调用。当这个钩子被调用时,组件实例依然还保有全部的功能。这个钩子在服务器端渲染期间不会被调用。unmounted()
:在卸载组件实例之后,调用。一个组件在以下情况下被视为已卸载:其所有子组件都已经被卸载。所有相关的响应式作用(渲染作用以及 setup()时创建的计算属性和侦听器)都已经停止。可以在这个钩子中手动清理一些副作用,例如计时器、DOM 事件监听器或者与服务器的连接。这个钩子在服务器端渲染期间不会被调用。
activated()
:若组件实例是缓存树的一部分,当组件被插入到 DOM 中时,调用。这个钩子在服务器端渲染期间不会被调用。
deactivated()
:若组件实例是缓存树的一部分,当组件从 DOM 中被移除时,调用。这个钩子在服务器端渲染期间不会被调用。
serverPrefetch()
:在组件实例在服务器上被渲染之前,调用。如果这个钩子返回了一个 Promise,服务端渲染会在渲染该组件前等待该 Promise 完成。这个钩子仅会在服务端渲染中执行,可以用于执行一些仅存在于服务端的数据抓取过程。
注册周期钩子
举个例子,mounted
钩子可以用来在组件完成初始渲染并创建 DOM 节点后运行代码。
export default { mounted() { console.log(`the component is now mounted.`) } }
还有其他一些钩子,会在实例生命周期的不同阶段被调用,最常用的是mounted
,updated
和unmounted
。
所有生命周期钩子函数的this
,上下文都会自动指向当前调用它的组件实例。注意:避免用箭头函数来定义生命周期钩子,因为如果这样的话,你将无法在函数中,通过this
获取组件实例。
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!