浅谈vue2.0与vue3.0的区别(整理十六点)

目录

1. 实现数据响应式的原理不同

2. 生命周期不同

3. vue 2.0 采用了 option 选项式 API,vue 3.0 采用了 composition 组合式 API

4. 新特性编译宏

5. 父子组件间双向数据绑定 v-model 不同

6. v-for 和 v-if 优先级不同

7. 使用的 diff 算法不同

8. 兄弟组件间的通信 eventBus

9. vue 3.0 提供了 TypeScript 支持

10. 脚手架不同

11. 获取 DOM 的方法不同

12. vue-router 的使用细节

13. vuex 与 pinia

14. vue 3.0 废除了 filters 过滤器的使用

15. template 模版中根标签的问题

16. 语法细节的不同

写在最后:


1. 实现数据响应式的原理不同

① vue 2.0: 

  • 通过 es5 的语法 Object.defineProperty(),数据劫持的方式实现数据的响应式。

② vue 3.0:

  • 通过 Proxy 代理对象的方式实现数据的响应式。
  • 因此,又多了一些定义响应式数据的方法,如 ref、reactive、roRef、toRefs
    • ref:接收简单类型或者对象类型的数据传入并返回一个响应式的对象(RefImpl)修改值,获取值的时候,需要.value
    • reactive:接受对象类型数据的参数传入并返回一个代理响应式的对象。(Proxy)
      • toRef:转换响应式对象某个属性为单独响应式数据,并且值是关联的
      • toRefs:转换响应式对象所有属性为单独响应式数据,并且值是关联的

2. 生命周期不同

① vue 2.0 一共 10 个生命周期

  • beforeCreate
  • created
  • beforeMount
  • mounted
  • beforeUpdate
  • updated
  • activated:keep-alive 组件缓存技术,激活
  • deactivated:keep-alive 组件缓存技术,未激活
  • beforeDestroy
  • destroyed

② vue 3.0 一共 7 个生命周期

  • setup
  • onBeforeMount
  • onMounted
  • onBeforeUpdate
  • onUpdated
  • onBeforeUnmount
  • onUnmounted

总结:

  • 废弃了 activated、deactivated 生命周期函数。
  • setup 函数是整个组件的起点,执行时机在 beforeCreate 之前,所以没有办法拿到当前组件实例 this。
  • 但是 setup 函数里可以接收两个形参 props 和 context
    • props 为属性
    • context 为当前组件实例,也是就相当于vue 2.0 中的 this。
  • vue 3.0 中的生命周期函数使用函数调用的方式执行,所以可以多次调用执行。

3. vue 2.0 采用了 option 选项式 API,vue 3.0 采用了 composition 组合式 API

① option API

  • 数据定义在 data 里,属性定义在 props 里,计算属性定义在 computed 里,方法定义在 methods 里。
  • 相较于 vue 3.0 则更易于学习和使用。

② composition API

  • 一个功能逻辑的代码组合在一起。
  • 相较于 vue 2.0 更易于阅读和维护。

小插曲,谈一谈自己对于 vue 2.0 和 vue 3.0 的选项式 API 和组合式 API 的理解:

vue 3.0 是在 2020 年 10 月发布的。由于写 vue 2.0 的时间比较早,所以当时在转入 vue 3.0 的时候,并没有花太多时间。感受最深的一点就是,在 vue 3.0 中无法使用 this,前文已经谈过 this 的问题,在这里不再赘述。而 vue 3.0 也可以分为两个版本,vue 3.3 以下的版本,其实感觉还是 option API 的写法,因为在 setup 函数平级的节点中,依然可以定义 props 和 components 节点,只不过是把数据和方法定义在 setup 函数里,然后通过 return 出来使用。

在 vue 3.3 及 3.3 以上的版本中,引入了 <script setup> 语法糖。此时,props 和 components 这些节点就不存在了,setup 函数也没有 return 了,那么为了使用 props 和 context 等,又提供了一些新的编译宏

4. 新特性编译宏

常用的编译宏如下:

  • defineProps:定义属性
  • defineEmits:定义自定义的事件的触发

  • defineExpose:向外暴露组件的属性和方法

    • 在非语法糖的写法中,通过 setup 函数的 return 出来了属性和方法,所以无须使用defineExpose

  • defineOptions:向外暴露组件的一些自定义属性,如 name

  • defineModel:vue 3.0 中父子组件间的双向数据绑定

    • const modelValue = defineModel()

5. 父子组件间双向数据绑定 v-model 不同

① vue 2.0:

  • 父组件默认传递的属性是 value,子组件默认触发的自定义事件是 input

② vue 3.0:

  • 父组件默认传递的属性是 modelValue,子组件默认触发的自定义事件是 update:modelValue

6. v-for 和 v-if 优先级不同

  • vue 2.0 中 v-for 的优先级高
  • vue 3.0 中 v-if 的优先级高

7. 使用的 diff 算法不同

① vue 2.0

  • 同级比较,根元素变化,整个 dom 树删除重建
  • 根元素未变
    • 属性改变,更新属性
    • 子元素内容改变
      • 无 key 就地更新
      • 有 key 按 key 比较

② vue 3.0

  • 将静态节点与动态节点分离
  • 通过高效标记和打补丁的方式,更新 dom

总结:

  • 所以 vue 3.0 的渲染性能优于 vue 2.0

8. 兄弟组件间的通信 eventBus

  • vue 2.0 中的 eventBus 是一个 vue 的实例对象
  • vue 3.0 中的eventBus 是 mitt 库

9. vue 3.0 提供了 TypeScript 支持

10. 脚手架不同

  • vue 2.0 的打包工具是 webpack
  • vue 3.0 的打包工具是 vite

11. 获取 DOM 的方法不同

  • vue 2.0 直接绑定 ref,使用 this.ref.属性名的方式直接获取
  • vue 3.0 需要先定义 const box = ref(null),再进行绑定

12. vue-router 的使用细节

① vue 2.0 

  • 通过 this.$router 和 this.$route 拿到全局的路由对象和当前的路由对象
  • 路由前置守卫
    • to: 即将要进入的目标 路由对象
    • from:当前导航正要离开的路由
    • next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
      • next(): 放行路由跳转
      • next(false):拦截路由跳转
const router = new VueRouter({ ... })router.beforeEach((to, from, next) => {// ...
})

② vue 3.0 

  • 通过 const router = useRouter() 和 const route = useRoute() 拿到全局的路由对象和当前的路由对象
  • 路由前置守卫
    • 少了 next 
    • return false 拦截回 from 的地址页面
    • return undefined / true 直接放行

const router = createRouter({ ... })router.beforeEach((to, from) => {// ...// 返回 false 以取消导航return false
})

13. vuex 与 pinia

① vue 2.0 vuex

  •  state 定义数据
  • mutations 执行同步代码,修改 state 中的数据必须通过 mutations,在组件中通过 commit 提交 mutation 的方式
  • actions 执行异步操作,在组件中通过中通过 dispatch 派遣 action 的方式
  • getters 类似于 computed 计算属性或者过滤器
  • modules 模块化

② vue 3.0 pinia

  • 将 mutations 和 actions 合二为一,不在区分同步和异步操作,去掉了 modules 模块化的概念,每一个 store 都是一个独立的模块
  • 提供了丰富的插件配置及配置对象,如在实现数据本地持久化上,可以通过插件直接配置 persist: true就可以直接实现。
    • 当时写 vue 2.0 的项目,记得是自己封装了一个 get、set 操作 localstorage 的方法去实现本地数据的持久化 

14. vue 3.0 废除了 filters 过滤器的使用

15. template 模版中根标签的问题

  • vue 2.0 中必须有一个根标签元素,vue 3.0 则不用

16. 语法细节的不同

  • 此外就是一些语法上的使用细节,不做深入比较阐述了。
  • 如:vue 3.0 一般是通过 Createxxx 创建实例
    • CreateApp 创建 vue 实例
    • CreateRouter 创建路由对象
    • CreatePinia 创建 pinia

写在最后:

个人实际开发中,使用下来感受到的区别和不同点,欢迎大佬们修正与补充。借用人民日报今年的广告语,“请你努力,为了你自己。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

小米,B站网络安全岗位笔试题目+答案

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

面试官问:请描述一次你成功解决问题的经历?

面试官为什么要这么问&#xff1f; 面试官问你描述一次成功解决问题的经历&#xff0c;主要是为了评估你的几个关键方面&#xff1a; 问题解决能力&#xff1a;了解你在面对挑战时的思维方式和应对策略。 决策能力&#xff1a;考察你在压力下做出明智决定的能力。 沟通技巧&am…

集团人事管理信息化目标及重点工作内容【数字化规划】

人力资源管理能力模型通常被细分为六个主要支柱&#xff0c;这些支柱共同构成了人力资源管理的核心框架。每个支柱分别涵盖了不同的HR职责和技能&#xff0c;以下是这六支柱能力模型的详细介绍&#xff1a; 1. 人力资源规划与策略&#xff08;HR Planning and Strategy&#xf…

自修C++PrimerPlus--类型转换、右值引用、引用中的类对象

目录 1.类型转换介绍 2.关闭vs2022的报警系统 3.string里面的I/O 4.引用和左值引用 4.1左值和右值的说明 4.2具体的代码演示 4.3字符和字符串的const区分 4.4右值引用的示例介绍 5.将引用应用于类对象 6.函数和C风格字符串 6.1两者的区别 6.2演示案例 1.类型转换介…

学习图解算法 使用C语言

图解算法 使用C语言 也就是通过C语言实现各种算法 链接&#xff1a;百度云盘 提取码&#xff1a;1001

中国空间计算产业链发展分析

2024中国空间计算产业链拆解 空间计算设备主要包括AR、VR、MR等终端设备。VR设备通常包括头戴式显示器&#xff08;VR头盔&#xff09;、手柄或追踪器等组件&#xff0c;用以完全封闭用户视野&#xff0c;营造虚拟环境体验。这些设备配备高分辨率显示屏、内置传感器和跟踪器。 …

哪些行业需要办理网络文化经营许可证?

网络文化经营许可证&#xff0c;是指经文化行政部门和电信管理机构批准&#xff0c;颁发给从事经营性互联网文化活动的互联网信息服务提供者的市场合法准入资质。经营性互联网文化活动是指以营利为目的&#xff0c;通过向上网用户收费或者电子商务、广告、赞助等方式获取利益&a…

linux 内核代码学习(九)--Linux内核启动和文件系统

一个比较顺手的学习平台可以达到事半功倍的效果&#xff0c;这里使用的平台环境主要是利用了主机和从机间的文件共享&#xff0c;以及从机自带的编译环境可以比较顺利的编译busybox1.0版本&#xff0c;方便进行内核和文件系统的测试了学习。 主机环境&#xff1a;vmware7.0win1…

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 内存分配和回收规则

文章目录 垃圾回收机制堆空间的基本结构内存分配和回收规则对象优先在 Eden 区分配分配担保机制 大对象直接进入老年代长期存活的对象进入老年代主要进行 GC 的区域部分收集 (Partial GC)&#xff1a;Minor GCMajor/Old GCMixed GC 整堆收集&#xff08;Full GC&#xff09; 空…

时序必读论文10|ICLR23 Crossformer 跨维度依赖的多变量时序预测模型

论文标题&#xff1a;iCROSSFORMER : TRANSFORMER UTILIZING CROSS DIMENSION DEPENDENCY FOR MULTIVARIATE TIME SERIES FORECASTING 开源代码&#xff1a;https://github.com/Thinklab-SJTU/Crossformer 前言 Crossformer是一篇非常典型的在transformer基础上魔改注意力机…

24/9/16 算法笔记 评估模型

评估机器学习模型的性能是一个关键步骤&#xff0c;它可以帮助我们了解模型在实际应用中的表现。以下是一些常用的评估模型的方法&#xff1a; 准确率&#xff08;Accuracy&#xff09;&#xff1a; 最常见的评估指标&#xff0c;表示正确预测的样本数占总样本数的比例。 精确度…

Linux命令:文本处理工具sed详解

目录 一、概述 二、用法 1、基本语法 2、常用选项 3、命令格式 4、编辑命令 5、获取帮助 三、 示例 1、替换字符串 2、删除行 &#xff08;1&#xff09;删除包含"string"的所有行 ​编辑 &#xff08;2&#xff09;删除从第1行到第10行的所有行 3、插…

MySQL篇(运算符)(持续更新迭代)

目录 一、简介 二、运算符使用 1. 算术运算符 1.1. 加法运算符 1.2. 减法运算符 1.3. 乘法与除法运算符 1.4. 求模&#xff08;求余&#xff09;运算符 2. 比较运算符 2.1. 等号运算符 2.2. 安全等于运算符 2.3. 不等于运算符 2.4. 空运算符 2.5. 非空运算符 2.6.…

java -- JDBC

一.JDBC概述: 过java语言操作数据库中的数据。 1.JDBC概念 JDBC&#xff08;Java DataBase Connectivity,java数据库连接&#xff09;是一种用于 执行SQL语句的Java API。JDBC是Java访问数据库的标准规范&#xff0c;可以 为不同的关系型数据库提供统一访问&#xff0c;它由…

CORS跨域请求共享

参考文章: https://xz.aliyun.com/t/12001?time__1311GqGxRGiti%3Dd052x%2BxCwx7qGIxpbDulE%3DoD https://blog.csdn.net/weixin_46622976/article/details/128452494 跨域资源共享 自己的理解&#xff0c;一般来讲&#xff0c;我们使用未授权的接口漏洞&#xff0c;都是因…

Django学习实战篇四(适合略有基础的新手小白学习)(从0开发项目)

前言&#xff1a; 在本章中&#xff0c;我们开始编写面向用户的界面&#xff0c;其中只涉及简单的HTML结构&#xff0c;不会做太多美化&#xff0c;目的就是把后台创建的数据展示到前台。 从技术上来讲&#xff0c;这一节将涉及Django 中function view和 class-based view 的用…

robosuite基础教程(一)——基本概念

robosuite和robomimic都是由ARISE Initiative开发的开源工具&#xff0c;旨在推进机器人学习和机器人操作领域的研究。 一、基本概念 robosuite是一个由MuJoCo物理引擎驱动的模拟框架&#xff0c;专为机器人学习设计。它提供了一套基准环境&#xff0c;是Advancing Robot Int…

Linux实操笔记2 Ubuntu安装Nginx的不同方法

今天来了解Ubuntu或者说Linux系统安装Nginx的几种办法。包括从Ubuntu的库安装到官方源码编译安装。 一、Nginx是什么&#xff1f; 以下是来自Nginx中文文档的内容。 Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: 作为 Web 服务器&#xff1a;相比…

瓶中水位检测系统源码分享

瓶中水位检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

研1日记13

正态分布&#xff1a; toTenor&#xff1a;转数字变为0-1 加载模型&#xff1a; model youmodel() model.load("路径") 测试单个样本&#xff1a;