Vue3 和Vue2的区别,以及钩子函数的使用

news/2024/7/10 1:08:22 标签: 前端, vue

Vue.js 3 和 Vue.js 2 是两个主要版本的流行前端框架,它们之间有很多区别,包括性能优化、新特性和改进的API等。以下是一些Vue 3与Vue 2之间的主要区别,以及一些示例代码来说明这些差异。

1. 性能优化

  • 响应式系统: Vue 3 使用了 Proxy 来实现响应式系统,相比 Vue 2 的 Object.defineProperty,它提供了更好的性能,并且能够检测到对象属性的添加和删除。
  • 虚拟DOM: Vue 3 对虚拟DOM进行了重写,以利用现代JavaScript引擎的优化。

2. 组合式API (Composition API)

Vue 3 引入了组合式API,这是一种新的方式来组织和重用代码逻辑。与Vue 2的选项API(Options API)相比,组合式API提供了更大的灵活性和更好的代码组织。

// Vue 2 (Options API)
export default {
  data() {
    return {
      count: 0
    };
  },
  methods: {
    increment() {
      this.count++;
    }
  }
};

// Vue 3 (Composition API)
import { ref } from 'vue';

export default {
  setup() {
    const count = ref(0);

    function increment() {
      count.value++;
    }

    return {
      count,
      increment
    };
  }
};

3. 片段特性

Vue 3 允许组件有多个根节点,而Vue 2每个组件只能有一个根节点。

vue"><!-- Vue 2 (单个根节点) -->
<template>
  <div>
    <header></header>
    <main></main>
    <footer></footer>
  </div>
</template>

<!-- Vue 3 (多个根节点) -->
<template>
  <header></header>
  <main></main>
  <footer></footer>
</template>

4. Teleport 特性

Vue 3 引入了 Teleport 特性,允许您将组件的子节点“传送”到DOM中的其他位置。

vue"><!-- 使用 Teleport 将模态框传送到 body 元素的末尾 -->
<template>
  <button @click="showModal = true">显示模态框</button>
  <teleport to="body">
    <div class="modal" v-if="showModal">
      我是模态框内容
    </div>
  </teleport>
</template>

5. 其他改进

  • 更好的错误处理: Vue 3 提供了更详细的错误信息和堆栈跟踪。
  • 更小的体积: Vue 3 的运行时体积比 Vue 2 更小。
  • 更好的TypeScript支持: Vue 3 的源代码是用TypeScript编写的,提供了更好的类型支持。

请注意,上面的 Teleport 特性实际上是在 Vue 3 的一个库 Vue Router 中提供的,而不是 Vue 核心库的一部分。我提供这个示例是为了展示 Vue 3 生态系统中的一些新特性,但请确保在实际项目中正确使用相关库和API。

总的来说,Vue 3 提供了很多改进和新特性,使得开发体验更加流畅,代码更加可维护。然而,由于这些变化,从 Vue 2 迁移到 Vue 3 可能需要一些时间和努力。

钩子函数

Vue.js 2 和 Vue.js 3 都提供了一套生命周期钩子函数,这些钩子允许开发者在组件的不同阶段执行代码。不过,Vue 3 引入了 Composition API,其中包含了新的钩子函数 setup,这个钩子在 Vue 2 中是不存在的。此外,Vue 3 也对部分生命周期钩子的名称进行了调整,以更好地反映其用途和触发时机。

Vue 2 的生命周期钩子

  • beforeCreate: 实例初始化之后,数据观测和事件/监听事件的配置之前被调用。
  • created: 实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测、属性和方法的运算、watch/event 事件回调。然而,挂载阶段还没开始。
  • beforeMount: 在挂载开始之前被调用,相关的 render 函数首次被调用。
  • mounted: 实例被挂载后调用,其中 el 被新创建的 vm.$el 替换。
  • beforeUpdate: 数据更新时调用,发生在虚拟DOM打补丁之前。
  • updated: 实例更新完毕之后调用。
  • beforeDestroy: 实例销毁之前调用。在这一步,实例仍然完全可用。
  • destroyed: 实例销毁后调用。

Vue 3 的生命周期钩子

Vue 3 保留了大部分 Vue 2 中的生命周期钩子,但是有两个钩子的名称发生了变化,同时也引入了新的 setup 钩子:

  • beforeMountmounted: 功能和用法与 Vue 2 中相同。
  • beforeUpdateupdated: 功能和用法与 Vue 2 中相同。
  • beforeUnmount: 替换了 Vue 2 中的 beforeDestroy,在组件卸载前调用。
  • unmounted: 替换了 Vue 2 中的 destroyed,在组件卸载后调用。
  • setup: Vue 3 新增的钩子,它是使用 Composition API 的入口点。setup 钩子在 beforeCreatecreated 钩子之前调用,并且不接受 this 上下文,因为它是组件实例被创建之前调用的。

Vue 3 中的 setup 钩子与 Composition API

在 Vue 3 中,你可以使用 setup 钩子来组织和共享组件的逻辑代码。setup 钩子函数接收两个参数:propscontext

import { ref } from 'vue';

export default {
  props: {
    propName: String,
  },
  setup(props, context) {
    const state = ref(0);

    function increment() {
      state.value++;
    }

    return {
      state,
      increment,
    };
  },
};

在上面的例子中,stateincrement 函数是组件的逻辑部分,它们被定义在 setup 钩子中,并最后返回给模板使用。props 是传入组件的属性,而 context 提供了一些额外的功能,比如访问 attrs、slots 和 emit 函数。

总之,Vue 3 中的生命周期钩子大部分与 Vue 2 相同,但是引入了一个新的 setup 钩子来支持 Composition API,并且对一些钩子的名称进行了调整以更好地描述其用途。


http://www.niftyadmin.cn/n/5322373.html

相关文章

2024年 13款 Linux 最强视频播放器

Linux视频播放器选择多样&#xff0c;如榛名、MPlayer、VLC等&#xff0c;功能强大、支持多格式&#xff0c;满足各类用户需求 Linux有许多非常强大的播放器&#xff0c;与windows最强视频播放器相比&#xff0c;几乎丝毫不逊色&#xff01; 一、榛名视频播放器 榛名视频播放…

C++学习笔记——私有继承、多重继承、类模板

目录 一、私有继承 二、多重继承 三、类模板 四、一个使用私有继承的示例代码 4.1代码 4.2输出结果 五、多重继承案列 六、类模板案例 C中的继承和模板是非常强大和灵活的特性&#xff0c;它们可以帮助我们实现代码复用、抽象和泛化等目标。本文将着重介绍私有继承、多…

路由前置守卫router.beforeEach相关用法

router.beforeEach 是 Vue Router 提供的全局前置守卫&#xff0c;用于在路由切换之前执行一些逻辑。该守卫接收三个参数&#xff1a; to: 即将要进入的目标路由对象。from: 当前导航正要离开的路由。next: 一个函数&#xff0c;用于 resolve 钩子。调用 next 表示路由可以继续…

Linux 内核学习 3a - 如何查看虚拟内存和物理内存,以及虚拟内存和物理内存之间转换

/proc/iomem, ioremap(), mmap() The kernel manages device resources like registers as physical addresses(物理地址). These are the addresses in /proc/iomem. The physical address is not directly useful to a driver; it must use ioremap() to map the space and …

Redis介绍

一、 Redis介绍 1. NoSQL的引言 NoSQL(Not Only SQL )&#xff0c;意即不仅仅是SQL, 泛指非关系型的数据库。Nosql这个技术门类,早期就有人提出,发展至2009年趋势越发高涨。 2. 为什么是NoSQL 随着互联网网站的兴起&#xff0c;传统的关系数据库在应付动态网站&#xff0c;…

【80211-2022】【学习记录】【第九章】帧类型格式【4】

一、Control Wrapper frame format Control Wrapper帧的格式如图9-48所示。 控制包装帧用于与HT控制字段一起包装任何其他控制帧(即&#xff0c;不包括控制包装帧)。 控制包装帧的Duration/ID字段是通过遵循正在包装的控制帧的Duration/ID字段的规则生成的。 控制包装帧的Addre…

用通俗易懂的方式讲解:大模型微调方法总结

大家好&#xff0c;今天给大家分享大模型微调方法&#xff1a;LoRA,Adapter,Prefix-tuning&#xff0c;P-tuning&#xff0c;Prompt-tuning。 文末有大模型一系列文章及技术交流方式&#xff0c;传统美德不要忘了&#xff0c;喜欢本文记得收藏、关注、点赞。 文章目录 1、LoRA…

VS QT 创建新的QT类后,编译报错无法解析的外部符号 “public: virtual struct QMetaObject const *

问题描述&#xff1a; 新建QT的 Widgets 类&#xff0c;创建新的窗口 在编译的时候出现以下报错信息&#xff1a; 1>vfhclassifydialog.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl VfhClassifyDialog::metaObject…