iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >由浅入深讲解vue2和vue3的区别
  • 227
分享到

由浅入深讲解vue2和vue3的区别

摘要

目录前言Vue2 vs vue3 对比双向绑定更新实例化生命周期获取props数据和方法的定义给父组件传值emitwatchEffect组件通信注意路由总结前言 vue2和vu3之前

前言

vue2和vu3之前的区别,一直以来是面试必考题目,如何回答,回答的层次决定了面试者的对于vue2,3的理解,以及对于vue3目前稳定版本发展的方向的了解,即考察使用程度,又考察了学习能力,可以说是回答即可以很简单,也可以很不简单,这里需要注意的是面试官的面试程度,需要我们层层递进,由浅入深来回答,这样可以体现出面试者的考虑全面,又能体现知识广度。简而言之,vue2升级vue3之后变得更快,更轻,协作更方便。无论对于我们开发者的体验或者用户使用方面都是升级优化,但是本质区别是什么,下面分为几个部分进行讲解。

vue2 vs vue3 对比

对比vue2vue3
脚手架命令式可视化创建脚⼿架
组件通信见下文见下文
数据监听watch,computedwatch,watchEffect,computed
双向绑定Object.definePropertyProxyapi
⽣命周期见下文见下文
api选项式组合式

双向绑定更新

vue2 的双向数据绑定是利⽤ES5 的⼀个 API ,Object.defineProperty()对数据进⾏劫持 结合 发布订阅模式的⽅式来实现的。

vue3 中使⽤了 es6 的 ProxyAPI 对数据代理,通过 Reactive() 函数给每⼀个对象都包⼀层 Proxy,通过 Proxy 监听属性的变化,从⽽ 实现对数据的监控

这⾥是相⽐于vue2版本,使⽤proxy的优势如下

1.defineProperty只能监听某个属性,不能对全对象监听 可以省去for in、闭包等内容来提升效率(直接绑定整个对象即可)

2.可以监听数组,不⽤再去单独的对数组做特异性操作,通过Proxy可以直接拦截所有对象类型数据的操作,完美⽀持对数组的监听。

实例化

Vue2.x中new出的实例对象,所有的东西都在这个vue对象上,这样其实⽆论你⽤到还是没⽤到,都会跑⼀遍,这样不仅提⾼了性能消耗,也⽆疑增加了⽤户加载时间。

⽽vue3.0中可以⽤ES module imports按需引⼊,如:keep-alive内置组件、v-model指令,等等,不仅我们开发起来更加的便捷,减少 了内存消耗,也同时减少了⽤户加载时间,优化⽤户体验。

生命周期

引用掘金图片如下:

获取props

vue2在script代码块可以直接获取props,vue3通过setup指令传递

vue2:console.log(‘props',this.xxx)
vue3:setup(props,context){ console.log(‘props',props) }

数据和方法的定义

Vue2使⽤的是选项类型API(Options API),Vue3使⽤的是合成型API(Composition API)

Vue2:

data() { return {}; }, methods:{ }

Vue3:

数据和⽅法都定义在setup中,并统⼀进⾏return{}

给父组件传值emit

vue2:this.$emit()
vue3:setup(props,context){context.emit()}

watchEffect

Vue3中除了watch,还引入了副作用监听函数watchEffect,用过之后我发现它和React中的useEffect很像,只不过watchEffect不需要传入依赖项。

那么什么是watchEffect呢?

watchEffect它会立即执行传入的一个函数,同时响应式追踪其依赖,并在其依赖变更时重新运行该函数。

computed和watch所依赖的数据必须是响应式的。Vue3引入了watchEffect,watchEffect 相当于将 watch 的依赖源和回调函数合并,当任何你有用到的响应式依赖更新时,该回调函数便会重新执行。不同于 watch的是watchEffect的回调函数会被立即执行,即({ immediate: true })。

组件通信

0244e04dc98042a88b8947ed634dd910.png

注意

props中数据流是单项的,即子组件不可改变父组件传来的值

在组合式API中,如果想在子组件中用其它变量接收props的值时需要使用toRef将props中的属性转为响应式。

attrs和listeners

子组件使用$attrs可以获得父组件除了props传递的属性和特性绑定属性 (class和 style)之外的所有属性。

子组件使用$listeners可以获得父组件(不含.native修饰器的)所有v-on事件监听器,在Vue3中已经不再使用;但是Vue3中的attrs不仅可以获得父组件传来的属性也可以获得父组件v-on事件监听器

路由

vue3和vue2路由常用功能只是写法上有些区别:

vue3的beforeRouteEnter作为路由守卫的示例是因为它在setup语法糖中是无法使用的;大家都知道setup中组件实例已经创建,是能够获取到组件实例的。而beforeRouteEnter是再进入路由前触发的,此时组件还未创建,所以是无法用在setup中的;如果想在setup语法糖中使用则需要再写一个script 如下:

<script>
export default {
  beforeRouteEnter(to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    next()
  },
};
</script>

vue3路由写法:

<script>
import { defineComponent } from 'vue'
import { useRoute, useRouter } from 'vue-router'
export default defineComponent({
  beforeRouteEnter (to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    next()
  },
  beforeRouteLeave ((to, from, next)=>{//离开当前的组件,触发
    next()       
  }),
  beforeRouteLeave((to, from, next)=>{//离开当前的组件,触发
    next()      
  }),
  setup() {
    const router = useRouter()
    const route = useRoute()
    const toPage = () => {
      router.push(xxx)
    }
 
    //获取params 注意是route
    route.params
    //获取query
    route.query
    return {
      toPage
    }
  },
});
</script>

vue2写法:

<script>
export default {
  beforeRouteEnter (to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    next()
  },
  beforeRouteEnter (to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    next()
  },
  beforeRouteLeave ((to, from, next)=>{//离开当前的组件,触发
    next()       
  }),
  beforeRouteLeave((to, from, next)=>{//离开当前的组件,触发
    next()      
  }),
  methods:{
    toPage(){
      //路由跳转
      this.$router.push(xxx)
    }
  },
  created(){
    //获取params
    this.$route.params
    //获取query
    this.$route.query
  }
}
</script>

总结

vue2和vue3比较还是有很多不一样的地方,比如setup语法糖的形式最为便捷而且更符合开发者习惯,未来vue3将会大面积使用这种规则,这样更加符合开发习惯和降低后续维护的成本,还有目前Vue3已经成为了Vue的默认版本,后续维护应该也会以Vue3为主。希望各位同学赶紧学起来吧~

到此这篇关于vue2和vue3的区别的文章就介绍到这了,更多相关vue2和vue3的区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 由浅入深讲解vue2和vue3的区别

本文链接: https://www.lsjlt.com/news/195134.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 由浅入深讲解vue2和vue3的区别
    目录前言vue2 vs vue3 对比双向绑定更新实例化生命周期获取props数据和方法的定义给父组件传值emitwatchEffect组件通信注意路由总结前言 vue2和vu3之前...
    99+
    2023-02-08
    vue2和vue3的区别是什么 vue2和vue3区别大吗 vue2和vue3原理的区别
  • Android——Theme和Style-由浅入深,全面讲解
    1、官方详细解读 样式和主题背景  |  Android 开发者  |  Android Developers 2、应用场景 类似web设计中css样式。将应用设计的细节与界面的结构和行为分开。 样式style :应用于 单个 View ...
    99+
    2023-09-01
    Android Theme主题背景 Style样式
  • Java由浅入深讲解继承下
    目录1.代码块初始化2.protected关键字3.final关键字4.Java中允许的继承方式本篇紧接上一篇内容继续,还是从继承里的细节开始 1.代码块初始化 关于代码块的定义和使...
    99+
    2024-04-02
  • Java由浅入深讲解继承上
    目录1.什么是继承2.继承的细节2.1super关键字2.2子类的构造方法2.3super和this区别继承同样是面向对象程序的特点 1.什么是继承 所谓继承就是抽取类的共性,进而实...
    99+
    2024-04-02
  • vue2和vue3的区别有哪些
    这篇文章主要介绍“vue2和vue3的区别有哪些”,在日常操作中,相信很多人在vue2和vue3的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue2和vue3的...
    99+
    2024-04-02
  • Vue2.x与Vue3.x中路由钩子的区别详解
    目录vue2.x前置概念:路由钩子分类路由和组件的概念(方便理解钩子函数)全局路由钩子路由配置守卫钩子组件内的守卫钩子路由钩子执行顺序eg: 从A组件跳转到B组件顺序如果B路有更新,...
    99+
    2024-04-02
  • vue3 中ref和reactive的区别讲解
    1. ref和reactive区别:    如果在template里使用的是ref类型的数据, 那么Vue会自动帮我们添加.value    ...
    99+
    2022-12-19
    vue3 ref和reactive的区别 vue3 ref和reactive vue  ref和reactive的区别
  • C语言由浅入深讲解线程的定义
    目录线程的概念线程的创建线程的终止线程标识的比较线程的取消线程等待线程分离线程的概念 可以简单理解为一个正在独立运行的函数 注: 1.posix线程是一套标准吗,而不是实现 2.线程...
    99+
    2024-04-02
  • Java由浅入深全面讲解方法的使用
    目录一、方法的概念及其使用1.1、什么是方法1.2、方法的定义1.3、方法调用的执行过程1.4、实参和形参的关系(重要)二、方法的重载2.1、为什么需要方法重载2.2、方法重载的定义...
    99+
    2024-04-02
  • js深拷贝和浅拷贝的深入讲解
    目录浅拷贝实现方法方法一:Object.assign方法二:扩展运算符方式方法三:concat和slice 浅拷贝数组深拷贝实现方法方法一:乞丐版(JSON.stringify和JS...
    99+
    2024-04-02
  • vue3和vue2的语法有哪些区别
    这篇文章主要介绍“vue3和vue2的语法有哪些区别”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue3和vue2的语法有哪些区别”文章能帮助大家解决问题。 ...
    99+
    2024-04-02
  • C语言由浅入深讲解文件的操作下篇
    目录文件的顺序读写字符输入输出fgetc和fputcfgetcfputc:文本行输入输出函数fgets和fputsfgets:fputs:格式化输入输出函数fscanf和fprint...
    99+
    2024-04-02
  • C语言由浅入深讲解文件的操作上篇
    目录为什么使用文件什么是文件文件名关于文件的一些概念文件函数fopenfclose实例代码绝对路径文件的打开方式文件操作流程为什么使用文件 前面写的通讯录,增加人数退出程序后,数据就...
    99+
    2024-04-02
  • c++深入浅出讲解堆排序和堆
    目录堆是什么最大堆最小堆堆排序最终代码关于堆堆是什么 堆是一种特殊的完全二叉树 如果你是初学者,你的表情一定是这样的 别想复杂 首先,你一定见过这种图 咱们暂时不管数字 这就是一个...
    99+
    2024-04-02
  • vue3的watch用法以及和vue2中watch的区别
    目录watch介绍Vue2 用法监听基础变量监听对象Vue3的用法监听基础类型监听复杂类型组合监听Vue 2 Vue3 小区别computed和watch的区别总结watch介绍 w...
    99+
    2023-05-16
    vue3的watch Vue2的watch vue2 vue3 watch区别
  • vue2.x,vue3.x使用provide/inject注入的区别说明
    目录vue2.x,vue3.x使用provide/inject注入区别provide/inject介绍vue2.x用法vue3.x用法vue的依赖注入问题总结vue2.x,vue3....
    99+
    2023-05-17
    vue3使用provide注入 vue3使用inject注入 vue2使用provide注入 vue2使用inject注入
  • 一文讨论Vue2中key和Vue3中key的区别
    作为一个Vue开发者,我们都知道,在Vue中使用v-for指令渲染列表时,必须要在每个子组件中加上一个key属性。这个key属性是一个特殊的属性,用于标识每个节点的唯一性。在Vue2.x版本中的key和Vue3.x版本中的key有很大的不同...
    99+
    2023-05-14
    Vue.js
  • 深入了解vue2与vue3的生命周期对比
    目录周期对比用法总结 周期对比 vue2 vue3 ...
    99+
    2024-04-02
  • new和malloc的区别深入解析
    1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void *malloc(unsigned int ...
    99+
    2022-11-15
    new malloc 区别
  • 浅拷贝和深拷贝的区别
    浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。 2、深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任...
    99+
    2023-09-21
    python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作