【Vue全家桶】细说组件中的生命周期
一、认识生命周期
1.1 认识生命周期
什么是生命周期呢?
- 每个组件都可能会经历从创建、挂载、更新、卸载等一系列的过程;
- 在这个过程中的某一个阶段,我们可能会想要添加一些属于自己的代码逻辑(比如组件创建完后就请求一些服务器数据);
- 但是我们如何可以知道目前组件正在哪一个过程呢?Vue给我们提供了组件的生命周期函数;
- 生命周期函数:
- 生命周期函数是一些钩子函数(回调函数),在某个时间会被Vue源码内部进行回调;
- 通过对生命周期函数的回调,我们可以知道目前组件正在经历什么阶段;
- 那么我们就可以在该生命周期中编写属于自己的逻辑代码了
生命周期的流程:
二、生命周期钩子(Composition API)
2.1 onMounted()
注册一个回调函数,在组件挂载完成后执行。
详细信息
-
组件在以下情况下被视为已挂载:
-
其所有同步子组件都已经被挂载 (不包含异步组件或
<Suspense>
树内的组件)。 -
其自身的 DOM 树已经创建完成并插入了父容器中。注意仅当根容器在文档中时,才可以保证组件 DOM 树也在文档中。
-
-
这个钩子通常用于执行需要访问组件所渲染的 DOM 树相关的副作用,或是在服务端渲染应用中用于确保 DOM 相关代码仅在客户端执行。
-
这个钩子在服务器端渲染期间不会被调用。
2.2 onUnmounted()
注册一个回调函数,在组件实例被卸载之后调用。
详细信息
-
一个组件在以下情况下被视为已卸载:
-
其所有子组件都已经被卸载。
-
所有相关的响应式作用 (渲染作用以及
setup()
时创建的计算属性和侦听器) 都已经停止。
-
-
可以在这个钩子中手动清理一些副作用,例如计时器、DOM 事件监听器或者与服务器的连接。
-
这个钩子在服务器端渲染期间不会被调用。
2.3 onUpdated()
注册一个回调函数,在组件因为响应式状态变更而更新其 DOM 树之后调用。
详细信息
-
父组件的更新钩子将在其子组件的更新钩子之后调用。
-
这个钩子会在组件的任意 DOM 更新后被调用,这些更新可能是由不同的状态变更导致的。
-
这个钩子在服务器端渲染期间不会被调用。
-
不要在 updated 钩子中更改组件的状态,这可能会导致无限的更新循环
2.4 onBeforeUpdate()
注册一个钩子,在组件即将因为响应式状态变更而更新其 DOM 树之前调用。
详细信息
- 这个钩子可以用来在 Vue 更新 DOM 之前访问 DOM 状态。在这个钩子中更改状态也是安全的。
- 这个钩子在服务器端渲染期间不会被调用。
2.5 onBeforeMount()
注册一个钩子,在组件被挂载之前被调用。
详细信息
-
当这个钩子被调用时,组件已经完成了其响应式状态的设置,但还没有创建 DOM 节点。它即将首次执行 DOM 渲染过程。
-
这个钩子在服务器端渲染期间不会被调用。
2.6 onBeforeUnmount()
注册一个钩子,在组件实例被卸载之前调用。
详细信息
- 当这个钩子被调用时,组件实例依然还保有全部的功能。
- 这个钩子在服务器端渲染期间不会被调用。
三、生命周期选项(Option API)
3.1 beforeCreate
在组件实例初始化完成之后立即调用。
详细信息
- 会在实例初始化完成、props 解析之后、
data()
和computed
等选项处理之前立即调用。 - 注意,组合式 API 中的
setup()
钩子会在所有选项式 API 钩子之前调用,beforeCreate()
也不例外。
3.2 created
在组件实例处理完所有与状态相关的选项后调用。
详细信息
- 当这个钩子被调用时,以下内容已经设置完成:响应式数据、计算属性、方法和侦听器。然而,此时挂载阶段还未开始,因此
$el
属性仍不可用。
3.3 beforeMount
在组件被挂载之前调用。
详细信息
- 当这个钩子被调用时,组件已经完成了其响应式状态的设置,但还没有创建 DOM 节点。它即将首次执行 DOM 渲染过程。
- 这个钩子在服务端渲染时不会被调用
3.4 mounted
在组件被挂载之后调用。
详细信息
- 组件在以下情况下被视为已挂载:
- 所有同步子组件都已经被挂载。(不包含异步组件或
<Suspense>
树内的组件) - 其自身的 DOM 树已经创建完成并插入了父容器中。注意仅当根容器在文档中时,才可以保证组件 DOM 树也在文档中。
- 所有同步子组件都已经被挂载。(不包含异步组件或
- 这个钩子通常用于执行需要访问组件所渲染的 DOM 树相关的副作用,或是在服务端渲染应用中用于确保 DOM 相关代码仅在客户端被调用。
- 这个钩子在服务端渲染时不会被调用。
3.5 beforeUpdate
在组件即将因为一个响应式状态变更而更新其 DOM 树之前调用。
详细信息
- 这个钩子可以用来在 Vue 更新 DOM 之前访问 DOM 状态。在这个钩子中更改状态也是安全的。
- 这个钩子在服务端渲染时不会被调用。
3.6 updated
在组件因为一个响应式状态变更而更新其 DOM 树之后调用。
详细信息
- 父组件的更新钩子将在其子组件的更新钩子之后调用。
- 这个钩子会在组件的任意 DOM 更新后被调用,这些更新可能是由不同的状态变更导致的。
- 这个钩子在服务端渲染时不会被调用。
3.7 beforeUnmount
在一个组件实例被卸载之前调用。
详细信息
- 当这个钩子被调用时,组件实例依然还保有全部的功能。
- 这个钩子在服务端渲染时不会被调用。
3.8 unmounted
在一个组件实例被卸载之后调用。
详细信息
- 一个组件在以下情况下被视为已卸载:
- 其所有子组件都已经被卸载。
- 所有相关的响应式作用 (渲染作用以及
setup()
时创建的计算属性和侦听器) 都已经停止。
- 可以在这个钩子中手动清理一些副作用,例如计时器、DOM 事件监听器或者与服务器的连接。
- 这个钩子在服务端渲染时不会被调用。
四、额外补充
4.1 created和mounted的区别
- created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图。
- mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作。
4.2 一般在哪个生命周期请求异步数据
我们可以在钩子函数 created
、beforeMount
、mounted
中进行调用,因为在这三个钩子函数中,data 已经创建,可以将服务端端返回的数据进行赋值。
推荐在 created
钩子函数中调用异步请求,因为在 created
钩子函数中调用异步请求有以下优点:
- 能更快获取到服务端数据,减少页面加载时间,用户体验更好;
- SSR不支持
beforeMount
、mounted
钩子函数,放在 created 中有助于一致性。