从Vue 2到Vue 3:生命周期的华丽转身

551 阅读5分钟

Vue 3 生命周期探秘:与Vue2的差异剖析

在前端的世界里,Vue.js一直以其优雅和简洁著称。随着Vue3的到来,众多开发者都在试图理解其生命周期的改变以及与Vue2之间的区别。今天,就让我们像一位时光旅者般深入Vue3的生命周期,探索其神秘之处,同时对比Vue2,揭开两个版本间生命周期差异的神秘面纱。

引言:生命周期,前端世界的“四季”

在Vue的世界中,组件的生命周期是其存在过程中遇到的一系列“事件季节”。从出生(创建)到成长(挂载),再到衰老(更新)和死亡(销毁),每一个阶段都有它独特的角色和任务。

Vue 2 的老韵味:熟悉的旋律

在Vue2中,生命周期钩子较为人熟知的包括created, mounted, updated, 和 destroyed等。这些都是以选项方式声明的,形成了Vue组件选项对象的核心部分。

Vue 2 生命周期

1. 实例初始化阶段

  • beforeCreate: 在实例初始化之后,数据观测 (data observer) 和事件/ watcher 事件配置之前被调用。
  • created: 实例已经创建完成,data、props、methods 已经初始化,但还未渲染模板,methods 已经初始化,但还未渲染模板,el 还未挂载。

2. 模板编译和挂载阶段

  • beforeMount: 在挂载开始之前被调用,相关的 render 函数首次被调用。
  • mounted: el 被新创建的 vm.el替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounnted 被调用时 vm.el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.el 也在文档内。

3. 更新阶段

  • beforeUpdate: 数据更新时调用,发生在虚拟 DOM 打补丁之前。
  • updated: 组件 DOM 已经更新,但是在这个阶段不会触发重新渲染。

4. 销毁阶段

  • beforeDestroy: 实例销毁之前调用。在这一步,实例仍然完全可用。
  • destroyed: Vue 实例销毁后调用。在这一步,所有的事件监听器已经被移除,所有的子实例也已经被销毁。

代码片段分析

export default {
  data() {
    return {
      message: "Hello Vue 2!"
    };
  },
  created() {
    console.log("组件创建完成");
  },
  mounted() {
    console.log("组件挂载到DOM上");
  },
  updated() {
    console.log("组件更新");
  },
  destroyed() {
    console.log("组件摧毁");
  }
};

在这段Vue2的标准代码里,每当组件达到其生命周期的某个特定阶段,相应的钩子函数就会被调用。

Vue3的新风尚:组合式API的魔法

进入Vue3,生命周期钩子过渡到了组合式API,这是一次颠覆性的革新。Vue 3 的 Composition API 引入了一种新的方式来组织和复用组件逻辑。在 Composition API 中,生命周期钩子不再是组件的选项,而是以函数的形式在 setup() 函数中调用。

setup()是组合式 API 的入口点。在组件实例被创建之后,但是属性和事件处理器等尚未被初始化之前调用。你可以在这里定义响应式状态、计算属性、事件处理器等。

Vue 3 的生命周期钩子命名与 Vue 2 略有不同,以 on 开头:

  • onBeforeMount : 在组件挂载之前调用,与 Vue 2 中的 beforeMount 相似。

  • onMounted : 在组件挂载完成后调用,与 Vue 2 中的 mounted 相似。

  • onBeforeUpdate : 在组件更新之前调用,与 Vue 2 中的 beforeUpdate 相似。

  • onUpdated : 在组件更新后调用,与 Vue 2 中的 updated 相似。

  • onBeforeUnmount : 在组件卸载之前调用,与 Vue 2 中的 beforeDestroy 相似。

  • onUnmounted : 在组件卸载后调用,与 Vue 2 中的 destroyed 相似。

与此同时,Vue 3 引入了两个新的生命周期钩子,用于渲染函数的追踪和触发:

  • renderTracked : 当依赖项被追踪时调用。

  • renderTriggered : 当依赖项变化并触发重新渲染时调用。

代码技术分析

import { onMounted, onUpdated, onUnmounted } from 'vue';

export default {
  setup() {
    onMounted(() => {
      console.log("Vue3组件挂载到DOM上");
    });
    onUpdated(() => {
      console.log("Vue3组件更新");
    });
    onUnmounted(() => {
      console.log("Vue3组件卸载");
    });

    return {
      message: 'Hello Vue 3!'
    };
  }
};

使用 Vue 3 的setup函数,生命周期钩子以更为函数式的方式被引入,使得代码结构更为清晰,并且易于理解和管理。

区别总结

  • 调用方式:在 Vue 2 中,生命周期钩子是作为组件选项直接定义的;而在 Vue 3 的 Composition API 中,它们需要在 setup() 函数中作为函数调用。
  • 命名差异:Vue 3 中的生命周期钩子以 on 开头,以区分于 Vue 2 的钩子名称。
  • 选项式 API 与 Composition API:Vue 2 主要使用选项式 API,而 Vue 3 支持两种风格,Composition API 用于更灵活的状态管理和逻辑复用。

整体代码分析:魔法背后的原理

Vue 3 使用Composition API带来了更好的逻辑复用与代码组织方式。通过引入setup()函数,Vue3不仅让生命周期钩子更加顺畅地整合进逻辑复用,也提高了组件逻辑的可测试性和可维护性。

代码核心技术分析

  • Vue 2 : 利用选项API管理生命周期,但在逻辑重用和源代码组织方面有局限。
  • Vue 3 : setup()和组合式API提供了更细粒度的控制和更好的逻辑封装,同时也简化了代码的维护。

结语:桥接过去与未来

Vue 3 的到来无疑为 Vue 生态注入了新的活力,带来了创新的编程范式。正如季节更替,每一代技术的演进都是对前端界一次深刻的启发和挑战。通过对 Vue 2 和 Vue 3 的生命周期进行详尽的探索和分析,我们不仅能更好地掌握 Vue 的使用,也可以洞察到 Web 开发趋势的未来。

于此同时,尽管 Vue 3 提供了 Composition API,但仍然支持传统的选项式 API,因此开发者可以根据自己的喜好和项目的需要选择使用哪种风格。不过,Composition API 被认为是 Vue 3 的未来方向,因为它提供了更好的可读性、可维护性和可复用性。