Vue2与Vue3: 关键差异与新特性介绍

目录

一、Vue 2 与 Vue 3 的关键差异

1.双向数据绑定原理:

Object.defineProperty() 的作用

Proxy API 简介

2.支持碎片(Fragment)

为什么支持碎片很重要?

如何实现的?

3.API类型

4.数据变量和方法的定义

5.生命周期钩子

Vue 2 生命周期钩子

Vue 3 生命周期钩子

两者之间主要的区别:

1. 引入方式

2. 使用场合

3. 响应式函数

4. 组合性

5. 生命周期顺序

6. 与模板的关系

6.父子传参

Vue 2 的父子传参

Vue 3 的父子传参

主要区别

7. 指令与插槽

8. main.js 文件的不同

二、Vue 3 的新特性

1. Fragments、Teleport 和 createRenderer

2. Composition API

3. 更好的 TypeScript 支持

4. 性能提升

5. 更易维护

三、非兼容变更

四、移除的 API

五、总结


一、Vue 2 与 Vue 3 的关键差异

1.双向数据绑定原理:

  • Vue2:

使用Object.defineProperty() 对属性进行劫持,结合发布订阅模式实现数据响应

仅仅能监听属性,不支持对整个对象的监听,且不适用于数组

Object.defineProperty() 的作用

Object.defineProperty() 方法允许精确地添加或修改对象的属性。此方法接收三个参数:

  1. 要添加属性的对象。
  2. 属性的名称。
  3. 一个描述符对象,该对象指定了属性的值、可写性、可枚举性、可配置性等。

例如:

let data = { val: 0 };
Object.defineProperty(data, 'prop', {get: function() {return this.val;},set: function(newVal) {this.val = newVal;},enumerable: true,configurable: true
});

这个例子定义了一个名为 prop 的属性,它读取和设置内部 val 属性的值。

  • Vue3:

采用ES6 Proxy API 对数据进行代理,实现更高效的数据监听

支持对对象和数组的监听,能够更细致地捕捉数据变化

Proxy API 简介

Proxy 是 ES6 引入的一种新的数据结构,它允许你创建一个对象的代理,从而在访问对象的属性或方法时进行拦截和自定义操作。Proxy 对象有两个参数:目标对象和处理器对象,处理器对象定义了当操作被执行时的自定义行为。

let target = { message: 'Hello' };
let handler = {get(target, property, receiver) {console.log(`Property ${property} has been read.`);return Reflect.get(target, property, receiver);},set(target, property, value, receiver) {console.log(`Property ${property} set to ${value}.`);return Reflect.set(target, property, value, receiver);}
};let proxy = new Proxy(target, handler);
proxy.message; // Property message has been read.
proxy.message = 'Hi'; // Property message set to Hi.

2.支持碎片(Fragment)

  • Vue2:不支持多个根节点
  • Vue3:支持多个根节点,增加了组件的灵活性

为什么支持碎片很重要?

更自然的模板结构:开发者可以更自然地编写模板,而不必为了满足单一根节点的限制而进行额外的包装。

避免不必要的 DOM 操作:不需要额外的包装元素,减少了 DOM 操作和潜在的性能影响。

更好的组件封装:组件可以返回多个独立的 DOM 元素,使得组件的封装和复用更加灵活。

提高代码的可维护性:模板结构更清晰,有助于提高代码的可读性和可维护性。

如何实现的?

Vue 3 使用了 Fragment 指令来实现对多个根节点的支持。在编译阶段,Vue 3 会将多个根节点的模板编译为一个 Fragment 节点,然后在渲染过程中,将 Fragment 节点拆分为多个独立的 DOM 元素。

3.API类型

  • Vue2:采用选项式API,将逻辑分割成data、computed、methods等部分
  • Vue3:采用组合式API,提供更灵活的逻辑组织方式

4.数据变量和方法的定义

Vue2:数据通过data()函数定义,方法在 methods 对象中定义

Vue3:引入setup()函数作为组件的入口点,集中定义数据和方法

5.生命周期钩子

Vue 2 生命周期钩子

Vue 2 的生命周期钩子分为几个阶段:

  1. 创建阶段

    • beforeCreate:在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。
    • created:在实例创建完成后被调用,此时,实例已完成数据观测、属性和方法的运算,$el 属性还未显示出来。
  2. 挂载阶段

    • beforeMount:在挂载开始之前被调用,相关的 render 函数首次被调用。
    • mounted:在 el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子,此时可以访问到 DOM 元素。
  3. 更新阶段

    • beforeUpdate:在数据变化之后,DOM 重新渲染之前调用,此时可以在这个钩子中进一步地更改状态。
    • updated:在由于数据更改导致的虚拟 DOM 重新渲染和打补丁后调用。
  4. 销毁阶段

    • beforeDestroy:在实例销毁之前调用,进行一些清理工作。
    • destroyed:在实例销毁后调用。

Vue 3 生命周期钩子

Vue 3 引入了 Composition API,带来了一组新的生命周期钩子,这些钩子在 setup 函数中使用:

  1. 创建阶段

    • setup:是 Composition API 的入口点,在组件实例创建之前执行,可以在这里声明响应式数据和函数。
  2. 挂载阶段

    • onBeforeMount:在挂载开始之前被调用,与 Vue 2 的 beforeMount 钩子相对应。
    • onMounted:在组件第一次挂载到 DOM 后调用,与 Vue 2 的 mounted 钩子相对应。
  3. 更新阶段

    • onBeforeUpdate:在更新开始之前被调用,与 Vue 2 的 beforeUpdate 钩子相对应。
    • onUpdated:在组件更新 DOM 后调用,与 Vue 2 的 updated 钩子相对应。
  4. 销毁阶段

    • onBeforeUnmount:在组件销毁之前调用,与 Vue 2 的 beforeDestroy 钩子相对应。
    • onUnmounted:在组件销毁后调用,与 Vue 2 的 destroyed 钩子相对应。

两者之间主要的区别:

1. 引入方式
  • Vue 2

    • 生命周期钩子是组件选项对象的一部分,不需要从外部引入。
  • Vue 3

    • 生命周期钩子函数需要从 vue 包中显式引入。
    • 使用组合式 API 时,这些生命周期钩子作为函数导入并在 setup 函数内部使用。
2. 使用场合
  • Vue 2

    • 生命周期钩子作为组件选项对象的属性来定义,例如 created()mounted(), 等等。
  • Vue 3

    • 在 setup 函数内部使用生命周期钩子,这是 Composition API 的一部分。

3. 响应式函数

  • Vue 2

    • 在 created 或 beforeMount 钩子中定义的响应式数据和函数可以直接通过 this 访问。
  • Vue 3

    • 在 setup 函数中定义的响应式数据和函数需要从 setup 返回,以便在模板或其他 Composition API 钩子中使用。

4. 组合性

  • Vue 2

    • 选项式 API 中的生命周期钩子是分离的,每个钩子处理不同的逻辑。
  • Vue 3

    • 使用组合式 API 时,生命周期钩子可以与响应式状态、计算属性和其他函数一起组合在 setup 函数中。

5. 生命周期顺序

  • Vue 2 和 Vue 3
    • 生命周期的顺序和阶段在两者中保持一致,但是 Vue 3 引入了新的 setup 阶段,这是在 beforeCreate 之前执行的。

6. 与模板的关系

  • Vue 2

    • 生命周期钩子中定义的响应式数据和函数自动与模板关联。
  • Vue 3

    • 在 setup 函数中返回的响应式数据和函数被模板使用。

6.父子传参

Vue 2 的父子传参

在 Vue 2 中,父子组件之间的参数传递主要依靠 props 和事件:

父传子(Props)

  • 父组件通过 props 向子组件传递数据。
  • 子组件通过声明 props 来接收来自父组件的数据。
// 子组件
export default {props: ['message']
};

子传父(事件)

  • 子组件使用 this.$emit 方法触发事件,并将数据传递给父组件。
  • 父组件在子组件标签上监听这些事件
// 子组件
this.$emit('my-event', someData);// 父组件
<ChildComponent @my-event="handleEvent"/>

Vue 3 的父子传参

Vue 3 保留了 Vue 2 的 props 和事件机制,但在组合式 API(setup 函数)中引入了 emit 函数,提供了一种新的方式来处理子组件向父组件传递数据:

  • 父传子(Props)

    与 Vue 2 类似,父组件通过 props 向子组件传递数据。
  • 子传父(事件)

    在 Vue 3 的 setup 函数中,emit 函数作为参数传入,可以直接使用,而不需要通过 this.$emit
// 子组件
import { defineComponent, ref } from 'vue';export default defineComponent({setup(props, { emit }) {// 直接使用 emit 触发事件function sendMessage() {emit('my-event', 'Hello from child');}return { sendMessage };}
});
  • 父组件的事件监听方式不变,仍然使用 @event 语法。
// 父组件
<ChildComponent @my-event="handleEvent"/>

主要区别

  • 子传父(组合式 API 中的 emit 函数)
    • Vue 3 中的 setup 函数为子组件提供了一个新的 emit 函数,使得事件触发更加直观和方便。
    • 这种新的事件触发方式仅在组合式 API 中使用,选项式 API 中的事件触发方式与 Vue 2 相同。

7. 指令与插槽

  • Vue 2slot 指令直接使用,v-for 优先级高于 v-if
  • Vue 3slot 指令需要使用 v-slot 的形式,v-for 和 v-if 可以更自然地结合使用。

8. main.js 文件的不同

  • Vue 2:使用构造函数的形式创建 Vue 应用。
  • Vue 3:使用工厂函数的形式,允许更灵活的应用创建方式。

二、Vue 3 的新特性

1. Fragments、Teleport 和 createRenderer

  • Fragments:允许组件拥有多个根节点,增加了组件的灵活性。
  • Teleport:能够将组件的某些部分传送到 DOM 中的其他位置,解决了 modals、toast 等元素的定位问题。
  • createRenderer:提供了创建自定义渲染器的能力,可以将 Vue 的开发模型扩展到其他平台。

2. Composition API

Composition API 提供了一种更灵活、更易于维护的方式来组织组件逻辑,支持逻辑的复用。它包括 refreactivecomputedwatch 等响应式函数,以及 setup() 函数作为组件的入口点。

3. 更好的 TypeScript 支持

Vue 3 重写时考虑了 TypeScript 的支持,使得开发者能够享受到更好的类型推断和类型检查。

4. 性能提升

Vue 3 在虚拟 DOM 的重写、组件初始化和编译模板方面进行了优化,提高了性能。Vue 3 的响应式系统和组件初始化过程也得到了改进,使得组件更新更快。

5. 更易维护

Vue 3 的架构改进使得代码更易于维护,同时提供了更好的逻辑组合和复用。

三、非兼容变更

Vue 3 带来了一些非兼容的变更,如全局 API 的更改、模板指令的变化、组件定义方式的调整等。这些变更虽然可能需要开发者对现有代码进行调整,但它们旨在提供更好的性能和更灵活的用法。

四、移除的 API

Vue 3 移除了一些 Vue 2 的 API,如 keyCode 修饰符、$on$off$once 实例方法、过滤器(filter)等。对于这些移除的 API,Vue 3 提供了替代方案,以帮助开发者平滑迁移。

五、总结

Vue 3 带来了许多令人兴奋的新特性和改进,包括组合式 API、更好的 TypeScript 支持、性能提升等。同时,它也进行了一些非兼容的变更和移除了一些 API。对于 Vue 开发者来说,Vue 3 提供了更多的可能性和更好的开发体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/54531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北交大研究突破:塑料光纤赋能低成本无摄像头AR/VR眼动追踪技术

北交大研究&#xff1a;探索无摄像头低成本AR/VR眼动追踪新路径 在AR/VR技术领域&#xff0c;眼动追踪作为一项关键技术&#xff0c;对于提升用户体验、优化渲染效率具有重要意义。然而&#xff0c;传统的眼动追踪方案多依赖于高成本的摄像头&#xff0c;这不仅增加了设备的制造…

解锁 Python 嵌套字典的奥秘:高效操作与实战应用指南

文章目录 前言&#x1f340;一、 什么是 Python 字典&#xff1f;1.1 字典的语法 &#x1f340;二、 字典的基本操作2.1 字典的创建2.2 访问字典中的值2.3 添加或修改键值对2.4 删除字典中的键值对 &#x1f340;三、 字典的遍历操作3.1 遍历字典的键3.2 遍历字典的值3.3 同时遍…

华为仓颉语言入门(9):for-in表达式

for-in 表达式用于遍历序列,它会依次访问序列中的每个元素,直到遍历完成。它常用于处理列表、数组或其他集合类型,能够有效简化代码,减少重复劳动。其基本语法如下: for (循环变量 in 序列) {循环体 }在 for-in 表达式中,每次循环都会检查是否遍历了序列中的所有元素。如…

【代码随想录Day34】动态规划Part03

0-1 背包问题 二维 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学透 0-1 背包问题&#xff01;| 关于背包问题&#xff0c;你不清楚的地方&#xff0c;这里都讲了&#xff01;| 动态规划经典问题 | 数据结构与算法_哔哩哔哩_bilibili import java.uti…

基于SSM的仿win10界面的酒店管理系统

基于SSM的仿win10界面的酒店管理系统 运行环境: jdk1.8 eclipse tomcat7 mysql5.7 项目技术: jspssm&#xff08;springspringmvcmybatis&#xff09;mysql 项目功能模块&#xff1a;基础功能、房间类型、楼层信息、附属功能

【Ubuntu】DNS设置不生效/重启被重置

/etc/resolv.conf 是一个链接&#xff0c;指向/run/systemd/resolve/stub-resolv.conf &#xff0c; ubuntuVM-4-13-ubuntu:/run/systemd/resolve$ ll /etc/resolv.conf lrwxrwxrwx 1 root root 39 Sep 30 14:40 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.…

大数据新视界 --大数据大厂之大数据驱动智能客服 -- 提升客户体验的核心动力

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

HUAWEI New4.9G 与 2.6G 无法正常切换问题处理案例

HUAWEI New4.9G 与 2.6G 无法正常切换问题处理案例 在某地市的 XX 音乐节保障准备期间&#xff0c;为确保活动期间的网络质量&#xff0c;现场新开了 4.9G HUAWEI 室外基站。在网络优化和测试中&#xff0c;发现UE无法实现从 2.6G 到 4.9G 的正常切换。虽然现场具备 4.9G信号覆…

【Router】路由功能之IP过滤(IP Filter)功能(基于端口)介绍及实现

IP过滤(IP Filter) IP Filter是一种通过对网络数据包中的 IP 地址进行分析和筛选,以实现对网络流量的控制和管理的技术。 IP过滤(IP Filter)作用 安全防护 可以阻止来自特定 IP 地址或 IP 地址范围的恶意攻击、非法访问等,增强网络的安全性。 流量管理 根据不同的 IP …

深度解析:Tkinter 界面布局与优化技巧

目录 深度解析&#xff1a;Tkinter 界面布局与优化技巧1. Tkinter 布局管理简介如何选择合适的布局管理器 2. pack() 布局管理详解嵌套布局 3. grid() 布局管理详解行列合并 4. place() 精确布局详解5. Tkinter 界面优化技巧自适应布局响应式布局资源管理 6. 项目示例&#xff…

每日OJ题_牛客_组队竞赛_贪心_C++_Java

目录 牛客_组队竞赛_贪心 题目解析 C代码1 C代码2 Java代码 牛客_组队竞赛_贪心 组队竞赛_牛客笔试题_牛客网 (nowcoder.com) 描述&#xff1a; 牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个…

【SQL】深入理解SQL:从基础概念到常用命令

目录 1. SQL基础概念1.1 数据库与表1.2 行与列1.3 数据库与表结构示意图 2. 常用SQL命令3. DML 命令3.1 SELECT语句3.2 INSERT语句3.3 UPDATE语句3.4 DELETE语句 4. DDL 命令3.4.1 CREATE 命令3.4.2 ALTER 命令3.4.3 DROP 命令 5. DCL 命令3.6.1 GRANT 命令3.6.2 REVOKE 命令 学…

【自然语言处理】补充:基于向量空间的分类器

【自然语言处理】补充:基于向量空间的分类器 文章目录 【自然语言处理】补充:基于向量空间的分类器1. 特征选择2. 基于向量空间的分类方法3. Rocchio4. KNN5. 线性分类器1. 特征选择 特征选择 文本分类中,通常要将文本表示在一个高维空间下,每一维对应一个词项许多维上对应…

VMware WorkStation Pro 15.5(低版本安装) 教学用

VMware WorkStation Pro 15.5(低版本安装) 教学用 文章目录 VMware WorkStation Pro 15.5(低版本安装) 教学用前言安装使用 前言 VMware Workstation Pro 15.5 是一款功能强大的桌面虚拟化软件&#xff0c;适用于在单台物理电脑上运行多个操作系统。它被广泛应用于软件开发、测…

PHP泛目录生成源码,可生成长尾关键词页面,带使用方法视频教程

介绍&#xff1a; 真正的好东西&#xff0c;搞网站优化seo从业必备。可以快速提升网站权重&#xff0c;带来的流量哗哗的 PHP泛目录生成源码 可生成新闻页面和关键词页面 带使用方法视频教程 泛目录可以用来提升网站收录和排名 合理运用目录可以达到快速出词和出权重的效果…

WDG看门狗在stm32中的应用

一&#xff0c;WDG看门狗的介绍 看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入长时间的罢工状态&#xff0c;保证系统的可靠性和安全性看…

精确度和召回率

精确度&#xff08;Precision&#xff09;和召回率&#xff08;Recall&#xff09;是评估分类模型性能的两个重要指标&#xff0c;尤其在处理不平衡数据集时非常有用。它们通常用于二分类问题&#xff0c;但也可以扩展到多分类问题。 精确度&#xff08;Precision&#xff09;…

论文推荐 |【Agent】自动化Agent设计系统

论文标题&#xff1a; Automated Design of Agentic Systems 论文地址&#xff1a; https://arxiv.org/abs/2408.08435 GitHub地址&#xff1a; https://github.com/ShengranHu/ADAS 自动化代理设计在性能和通用性方面显著超越了手动方法。 • 引入了自动化代理系统设计&am…

JS模块化工具requirejs详解

文章目录 JS模块化工具requirejs详解一、引言二、RequireJS 简介1、什么是 RequireJS2、RequireJS 的优势 三、RequireJS 的使用1、配置 RequireJS1.1、基础配置 2、定义模块3、加载模块 四、总结 JS模块化工具requirejs详解 一、引言 随着前端技术的快速发展&#xff0c;Jav…

这些编程工具竟然能让我效率翻倍?开发者必备神器盘点!

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…