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

yizhihongxing

深入了解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日

相关文章

  • 详解android与服务端交互的两种方式

    下面我会对“详解android与服务端交互的两种方式”的攻略进行详细讲解。 一、使用HTTP请求进行交互 HTTP是一种应用层协议,是客户端与服务端进行通信的基础。因此,我们可以使用HTTP请求实现android与服务端的交互。 1.1 HttpClient HttpClient是一个Java语言编写的HTTP客户端工具,包含了HTTP协议相关的所有必要操作…

    other 2023年6月27日
    00
  • 东芝复印机怎么使用自带USB口打印U盘内的文件?

    以下是详细讲解“东芝复印机怎么使用自带USB口打印U盘内的文件?”的完整攻略: 准备工作 首先,要保证复印机已正确连接电源和电脑,并且U盘也已插入复印机的USB口。接着,按照如下步骤操作。 步骤一:进入打印模式 打开复印机,进入主菜单界面。 在主菜单中找到“打印”选项,点击进入打印模式。 步骤二:选择打印方式 进入打印模式后,您将看到多个打印方式,包括“文件…

    other 2023年6月27日
    00
  • 铭飞mcms初步学习

    以下是关于“铭飞mcms初步学习”的完整攻略,包括基本知识和两个示例。 基本知识 铭飞mcms是一款基于PHP的内容管理系统,它提供了丰富的功能和易于使用的界面,使用户可以轻松地创建和管理网站。以下是使用铭飞mcms的基本步骤: 下载并安装铭飞mcms。 在铭飞mcms的官方网站上下载并安装铭飞mcms。 登录并配置铭飞mcms。 在浏览器中打开铭飞mcms…

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

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

    other 2023年6月25日
    00
  • suse11入门学习

    suse11入门学习 SUSE Linux Enterprise is a reliable, scalable, and secure server operating system that is designed to meet the demands of enterprise applications. If you are looking to …

    其他 2023年3月29日
    00
  • Shell脚本获取本地网卡IP、mac地址、子网掩码、dns IP、外网IP

    Shell脚本获取本地网卡IP、mac地址、子网掩码、DNS IP、外网IP的攻略 在Shell脚本中,可以使用一些命令和工具来获取本地网卡IP、mac地址、子网掩码、DNS IP和外网IP。下面是一个完整的攻略,包含了两个示例说明。 步骤1:获取本地网卡信息 首先,我们需要获取本地网卡的信息,包括IP地址、mac地址和子网掩码。可以使用ifconfig命令…

    other 2023年7月31日
    00
  • IOS NSUserDefault 记住用户名及密码功能的实例代码

    下面是关于 iOS NSUserDefaults 记住用户名及密码功能的实例代码的详细攻略。 介绍 NSUserDefault是iOS的一个用于保存应用程序中简单数据的类,通过它可以将数据存储在用户设备中,并且能够够实现跨应用程序访问,比如保存用户的用户名,使用户再次打开应用的时候无需再次输入。在本文中,我们将使用NSUserDefault类来实现应用程序记…

    other 2023年6月27日
    00
  • Java三大特性之封装详解

    Java三大特性之封装详解 在Java中,封装是面向对象编程的三大特性之一。封装是指将数据和方法包装在一个单元中,通过访问修饰符来控制对数据的访问。封装的目的是隐藏内部实现细节,提供对外部的安全访问接口。 封装的优点 封装具有以下几个优点: 数据隐藏:封装可以将数据隐藏在类的内部,只暴露必要的接口给外部使用。这样可以防止外部直接访问和修改数据,保证数据的安全…

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