目录
三、Vue 2 生命周期与 Vue 3 生命周期的差别对比:
Vue.js 是一款流行的 JavaScript 框架,被广泛用于构建现代化的用户界面。Vue 2 是 Vue.js 的旧版本,而 Vue 3 是最新的版本。本文将介绍 Vue 2 生命周期和 Vue 3 生命周期,并对两个版本进行对比,以帮助开发者更好地理解和使用 Vue.js。
Vue 2 生命周期由一系列钩子函数组成,这些钩子函数允许开发者在组件的不同生命周期阶段执行特定的操作。Vue 2 生命周期包括以下阶段:
beforeCreate:在实例初始化之后,数据观测 (data observation) 和事件配置 (event/watcher setup) 之前调用。
created:在实例创建完成后被调用,此时实例已完成数据观测,但尚未挂载到 DOM 上。
在实例创建完成后被立即同步调用。在这一步中,实例已完成对选项的处理,意味着以下内容已被配置完毕:数据侦听、计算属性、方法、事件/侦听器的回调函数。然而,挂载阶段还没开始,且
$el
property 目前尚不可用。
beforeMount:在挂载开始之前被调用,相关的 render 函数首次被调用。
mounted:实例被挂载后调用,此时组件已经在 DOM 中渲染完成。
实例被挂载后调用,这时
el
被新创建的vm.$el
替换了。如果根实例挂载到了一个文档内的元素上,当mounted
被调用时vm.$el
也在文档内。注意
mounted
不会保证所有的子组件也都被挂载完成。如果你希望等到整个视图都渲染完毕再执行某些操作,可以在mounted
内部使用 vm.$nextTick:
- mounted: function () {
- this.$nextTick(function () {
- // 仅在整个视图都被渲染之后才会运行的代码
- })
- }
beforeUpdate:数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。
updated:组件更新完成后调用,此时虚拟 DOM 已重新渲染并应用补丁。
在数据更改导致的虚拟 DOM 重新渲染和更新完毕之后被调用。
当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或 watcher 取而代之。
注意,
updated
不会保证所有的子组件也都被重新渲染完毕。如果你希望等到整个视图都渲染完毕,可以在updated
里使用 vm.$nextTick:
- updated: function () {
- this.$nextTick(function () {
- // 仅在整个视图都被重新渲染之后才会运行的代码
- })
- }
activated: 被 keep-alive 缓存的组件激活时调用。
deactivated:被 keep-alive 缓存的组件失活时调用
beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。
destroyed:实例销毁后调用,此时所有的事件监听器被移除,所有的子实例也被销毁。
errorCaptured 在捕获一个来自后代组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false
以阻止该错误继续向上传播。
你可以在此钩子中修改组件的状态。因此在捕获错误时,在模板或渲染函数中有一个条件判断来绕过其它内容就很重要;不然该组件可能会进入一个无限的渲染循环。
错误传播规则
默认情况下,如果全局的 config.errorHandler
被定义,所有的错误仍会发送它,因此这些错误仍然会向单一的分析服务的地方进行汇报。
如果一个组件的 inheritance chain (继承链)或 parent chain (父链)中存在多个 errorCaptured
钩子,则它们将会被相同的错误逐个唤起。
如果此 errorCaptured
钩子自身抛出了一个错误,则这个新错误和原本被捕获的错误都会发送给全局的 config.errorHandler
。
一个 errorCaptured
钩子能够返回 false
以阻止错误继续向上传播。本质上是说“这个错误已经被搞定了且应该被忽略”。它会阻止其它任何会被这个错误唤起的 errorCaptured
钩子和全局的 config.errorHandler
。
每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板,挂载实例到 DOM,以及在数据改变时更新 DOM。在此过程中,它也会运行被称为生命周期钩子的函数,让开发者有机会在特定阶段运行自己的代码。
举例来说,onMounted
钩子可以用来在组件完成初始渲染并创建 DOM 节点后运行代码:
- <script setup>
- import { onMounted } from 'vue'
-
- onMounted(() => {
- console.log(`the component is now mounted.`)
- })
- </script>
还有其他一些钩子,会在实例生命周期的不同阶段被调用,最常用的是 onMounted、onUpdated 和 onUnmounted。所有生命周期钩子的完整参考及其用法请参考 API 索引。
当调用 onMounted
时,Vue 会自动将回调函数注册到当前正被初始化的组件实例上。这意味着这些钩子应当在组件初始化时被同步注册。例如,请不要这样做:
- setTimeout(() => {
- onMounted(() => {
- // 异步注册时当前组件实例已丢失
- // 这将不会正常工作
- })
- }, 100)
注意这并不意味着对 onMounted
的调用必须放在 setup()
或 内的词法上下文中。
onMounted()
也可以在一个外部函数中调用,只要调用栈是同步的,且最终起源自 setup()
就可以。
下面是实例生命周期的图表。你现在并不需要完全理解图中的所有内容,但以后它将是一个有用的参考。
1、setup() : 开始创建组件之前,在 beforeCreate 和 created 之前执行,创建的是 data 和 method
2、onBeforeMount() : 组件挂载到节点上之前执行的函数;
3、onMounted() : 组件挂载完成后执行的函数;
4、onBeforeUpdate(): 组件更新之前执行的函数;
5、onUpdated(): 组件更新完成之后执行的函数;
6、onBeforeUnmount(): 组件卸载之前执行的函数;
7、onUnmounted(): 组件卸载完成后执行的函数;
8、onActivated(): 被包含在
9、onDeactivated(): 比如从 A 组件,切换到 B 组件,A 组件消失时执行;
10、onErrorCaptured(): 当捕获一个来自子孙组件的异常时激活钩子函数。
- vue2 -------> vue3
-
- beforeCreate --------> setup(()=>{})
- created --------> setup(()=>{})
- beforeMount --------> onBeforeMount(()=>{})
- mounted --------> onMounted(()=>{})
- beforeUpdate --------> onBeforeUpdate(()=>{})
- updated --------> onUpdated(()=>{})
- beforeDestroy --------> onBeforeUnmount(()=>{})
- destroyed --------> onUnmounted(()=>{})
- activated --------> onActivated(()=>{})
- deactivated --------> onDeactivated(()=>{})
- errorCaptured --------> onErrorCaptured(()=>{})
总结: Vue2和Vue3钩子变化不大,beforeCreate 、created 两个钩子被setup()钩子来替代。