深入了解vue2与vue3的生命周期对比

深入了解vue2与vue3的生命周期对比

Vue.js是一个流行的前端框架,它的生命周期是至关重要的概念。Vue2和Vue3的生命周期有一些区别。在本文中,我们将深入探讨这些区别。

Vue2的生命周期

Vue2的生命周期分为8个阶段,分别是:

  1. beforeCreate - 在实例初始化之后、数据监测之前被调用。
  2. created - 实例已经创建完成之后被调用。在这一步,实例已经完成了数据观测、属性和方法的运算、watch/event事件回调。然而,挂载阶段还没有开始。$el属性目前尚不可用。
  3. beforeMount - 在挂载开始之前被调用:相关的render函数首次被调用。
  4. mounted - 实例挂载完成后被调用,这时不保证子组件也都一起挂载完。
  5. beforeUpdate - 数据更新时调用,发生在虚拟DOM重新渲染和打补丁之前,我们在这里可以进一步地更改状态,不会导致附加的重渲染过程。(在这个钩子中,不能执行同步或异步 DOM 更新。如果需要,请改用 updated 钩子。)
  6. updated - 由于数据更改导致的虚拟 DOM 重新渲染和打补丁后会调用该钩子。
  7. beforeDestroy - 实例销毁之前调用。在这一步,实例仍然完全可用。
  8. destroyed - 实例销毁之后调用。这个时候,只剩下了它的DOM了。

Vue3的生命周期

Vue3的生命周期相比Vue2发生了很多变化,主要是为了优化性能。Vue3的生命周期分为10个阶段,分别是:

  1. beforeCreate - 在实例初始化之后、数据监测之前被调用。
  2. setup - 执行一次。该函数在实例创建之后才会被调用,并在Render之前挂钩CLI插件或者全局导入。要在setup中使用响应性,可以使用reactive、ref等方法。
  3. onBeforeMount - 在挂载之前被调用,类似于beforeMount。
  4. onMounted - 在实例挂载之后被调用,类似于mounted。
  5. onBeforeUpdate - 在虚拟DOM更新之前被调用,类似于beforeUpdate。
  6. onUpdated - 在虚拟DOM更新之后被调用,类似于updated。
  7. onBeforeUnmount - 在实例销毁之前被调用,类似于beforeDestroy。
  8. onUnmounted - 在实例销毁之后调用,类似于destroyed。
  9. onActivated - 在组件被激活时被调用,Keep-Alive组件使用。类似于activated。
  10. onDeactivated - 在组件被停用时调用,类似于deactivated。

示例

以下示例演示了Vue2和Vue3中生命周期的区别。

Vue2示例

我们创建一个简单的组件来演示生命周期:

<template>
  <div>
    <h1>{{ message }}</h1>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello world'
    }
  },
  beforeCreate() {
    console.log('Before create Vue2')
  },
  created() {
    console.log('Created Vue2')
  },
  beforeMount() {
    console.log('Before mount Vue2')
  },
  mounted() {
    console.log('Mounted Vue2')
  },
  beforeUpdate() {
    console.log('Before update Vue2')
  },
  updated() {
    console.log('Updated Vue2')
  },
  beforeDestroy() {
    console.log('Before destroy Vue2')
  },
  destroyed() {
    console.log('Destroyed Vue2')
  }
}
</script>

当我们在父组件中使用这个组件时,这里的生命周期将会打印到控制台上:

<template>
  <div>
    <hello-world />
  </div>
</template>

<script>
import HelloWorld from './HelloWorld.vue'

export default {
  components: {
    HelloWorld
  },
  beforeCreate() {
    console.log('Before create Vue2 parent')
  },
  created() {
    console.log('Created Vue2 parent')
  },
  beforeMount() {
    console.log('Before mount Vue2 parent')
  },
  mounted() {
    console.log('Mounted Vue2 parent')
  },
  beforeUpdate() {
    console.log('Before update Vue2 parent')
  },
  updated() {
    console.log('Updated Vue2 parent')
  },
  beforeDestroy() {
    console.log('Before destroy Vue2 parent')
  },
  destroyed() {
    console.log('Destroyed Vue2 parent')
  }
}
</script>

Vue3示例

现在我们用Vue3重写相同的组件,如下所示:

<template>
  <div>
    <h1>{{ message }}</h1>
  </div>
</template>

<script>
import { reactive, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from 'vue'

export default {
  setup() {
    const data = reactive({
      message: 'Hello world'
    })

    onBeforeMount(() => {
      console.log('Before mount Vue3')
    }),
    onMounted(() => {
      console.log('Mounted Vue3')
    }),
    onBeforeUpdate(() => {
      console.log('Before update Vue3')
    }),
    onUpdated(() => {
      console.log('Updated Vue3')
    }),
    onBeforeUnmount(() => {
      console.log('Before destroy Vue3')
    }),
    onUnmounted(() => {
      console.log('Destroyed Vue3')
    })

    return {
      ...data
    }
  }
}
</script>

现在,我们可以在父组件中使用此组件:

<template>
  <div>
    <HelloWorld />
  </div>
</template>

<script>
import HelloWorld from './HelloWorld.vue'

export default {
  components: {
    HelloWorld
  },
  beforeCreate() {
    console.log('Before create Vue3 parent')
  },
  created() {
    console.log('Created Vue3 parent')
  },
  beforeMount() {
    console.log('Before mount Vue3 parent')
  },
  mounted() {
    console.log('Mounted Vue3 parent')
  },
  beforeUpdate() {
    console.log('Before update Vue3 parent')
  },
  updated() {
    console.log('Updated Vue3 parent')
  },
  beforeDestroy() {
    console.log('Before destroy Vue3 parent')
  },
  destroyed() {
    console.log('Destroyed Vue3 parent')
  }
}
</script>

以上示例说明了Vue2和Vue3的生命周期的区别。Vue3的生命周期优化到了异步执行,使得更高效,也更灵活。但是还需要充分理解,在项目中结合实践才能实现更好的开发效率和用户体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入了解vue2与vue3的生命周期对比 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 最新QQ6.8体验版下载发布 版本号13530

    最新QQ6.8体验版下载发布攻略 版本号:13530 欢迎使用最新发布的QQ6.8体验版!本攻略将为您提供详细的下载和安装步骤,以及两个示例说明。 下载步骤 首先,访问QQ官方网站(https://www.qq.com)。 在网站首页,找到并点击“下载”按钮。 在下载页面,您将看到最新版本的QQ体验版(版本号:13530)。点击下载按钮开始下载安装程序。 安…

    other 2023年8月3日
    00
  • win10纯净版exe应用程序打不开如何解决的图文步骤

    下面是关于 “win10纯净版exe应用程序打不开如何解决的图文步骤” 的详细攻略。 1. 问题描述 在使用 Win10 纯净版时,可能会遇到 exe 应用程序无法启动的问题。这可能是由于某些安全设置或其他因素导致的。那么应该如何解决这个问题呢? 2. 解决步骤 步骤一:检查 Windows 安全设置 打开 Windows 安全设置:在 Windows 搜索…

    other 2023年6月25日
    00
  • 面试题:三行三列布局、表格有合并且不准嵌套使用表格

    面试题:三行三列布局、表格有合并且不准嵌套使用表格的完整攻略 在这个面试题中,我们需要实现一个三行三列的布局,并在表格中进行合并操作,但不允许使用嵌套表格。下面是一个完整的攻略,包含了两个示例说明。 步骤一:创建基本布局 首先,我们需要创建一个基本的三行三列布局。可以使用HTML和CSS来实现这个布局。以下是一个示例的HTML代码: <div clas…

    other 2023年7月28日
    00
  • AI怎么设计一个2.5D小楼房模型?

    针对 “AI怎么设计一个2.5D小楼房模型?” 这个问题,我提供以下完整攻略: 1. 什么是2.5D小楼房模型? 2.5D小楼房模型是指在二维平面上按立体要求设计出来的房屋模型,可以在3D视角下展示出来,但仍保留着2D平面的特点,常用于视频游戏、动画、建筑模型等领域。 2. 设计2.5D小楼房模型的步骤 2.1 确定设计需求 在设计之前,需明确设计需求。包括…

    other 2023年6月27日
    00
  • vs2010打包安装包带数据库

    VS2010打包安装包带数据库 在软件开发过程中,经常需要将开发完成的程序打包成安装包进行发布。为了方便用户的安装,可以将程序的依赖项也打包进去,比如数据库。本文将介绍如何使用VS2010打包安装包并将数据库一起打包。 准备工作 在开始之前,需要安装VS2010和SQL Server 2008 R2(假设你的程序是基于该版本的数据库开发的)。同时,需要确保你…

    其他 2023年3月28日
    00
  • 魔兽世界wlk怀旧服冰dk堆什么属性 冰dk属性优先级选择攻略

    魔兽世界WLK怀旧服冰DK堆什么属性 1. 属性优先级 冰DK的属性优先级选择如下: 力量:力量是冰DK主要的输出属性,每1点力量可以提供2点攻击强度,因此力量是冰DK最重要的属性。 精通:精通可以提高冰DK的攻击速度和暴击率,这对提升输出非常有用,因此精通值应该尽量接近使用软妹币可买得来的上限。 暴击:暴击是冰DK的重要输出属性,每1点暴击可以提高2%的暴…

    other 2023年6月27日
    00
  • Angular.js之作用域scope’@’,’=’,’&’实例详解

    Angular.js之作用域(scope) ‘@’, ‘=’, ‘&’ 实例详解 Angular.js是一个流行的JavaScript框架,它使用了一种称为作用域(scope)的概念来管理数据和事件。作用域(scope)是一个对象,它将控制器(controller)和视图(view)连接起来,使它们能够相互通信。 在Angular.js中,作用域(s…

    other 2023年8月19日
    00
  • Java堆&优先级队列示例讲解(上)

    Java堆 & 优先级队列示例讲解(上) 概述 本文将详细讲解Java堆和优先级队列的概念以及使用方法。首先,我们将对Java堆进行介绍,然后介绍优先级队列的概念,并提供两个示例来说明其用法。 Java堆 Java堆是Java虚拟机管理的内存中的一部分,用于存储对象实例。Java堆在JVM启动时被创建,并在JVM关闭时被销毁。堆是线程共享的,所有线程…

    other 2023年6月28日
    00
合作推广
合作推广
分享本页
返回顶部