Vue2与 Vue3的区别

一、  生命周期钩子函数不同

整体上变化不大,只是大部分生命周期钩子名称前 + “on”,功能上是类似的。

1、vue3中新引入了setup生命周期,setup 是围绕 beforeCreate 和 created 生命周期钩子运行的。

2、destroyed 生命周期选项被重命名为 onUnmounted

3、beforeDestroy 生命周期选项被重命名为 onBeforeUnmount

4、新增加了onRenderTracked和onRenderTriggered

5、vue3 的生命周期在调用前需要先进行引入,并将它们包在 setup 方法中:

 


二、  定义数据变量和方法不同

Vue2:定义数据变量是data(){},创建的方法要在methods:{}中。

Vue3:定义数据和方法在setup()方法里面,return一个对象。


三、  双向数据绑定原理不同

        vue2: 使用Object.defineProperty劫持数据,使用发布订阅模式实现数据绑定。只能监听某个属性,不能对全对象监听。

        vue3: 使用ProxyAPI对数据代理,通过 reactive() 函数来创建响应式对象,给每⼀个对象都包⼀层 Proxy,通过 Proxy 监听属性的变化。

    相比于vue2.x,使用proxy的优势如下:

        1、defineProperty只能监听某个属性,不能对全对象监听

        2、可以省去for in、闭包等内容来提升效率(直接绑定整个对象即可)

        3、可以监听数组,不用再去单独的对数组做特异性操作 vue3.x可以检测到数组内部数据的变化
 

四、是否支持碎片

       Vue2:不支持碎片。vue2 在模板中如果使用多个根节点时会报错。

       Vue3:支持碎片,即支持多个根节点。
 

五、API类型不同

Vue2:使用选项类型API,选项型API在代码里分割了不同的属性:data,computed,methods等。

Vue3:提供了两个语法,一个是选项式API,另外新增了组合式API。使用组合式API,将同一个功能的代码集中起来处理,相比于传统的选项式 API,组合式 API 使代码会更加简便整洁、可读性强。
 

六、父子传参不同

Vue2: 父传子:子组件通过prop接收;子传父:子组件中通过$emit向父组件触发一个监听方法,传递一个参数。

Vue3:  使用setup接收两个参数 setup(props, context){ }:

① 第一个参数是props,即父组件向子组件传递的props的值;

② 第二个值为content代表了当前的上下文对象(包含attrs、slots、emit),对象中取出emit可以给事件推送数据,context.emit("xxx", val)。


 

注意事项:

1、setup函数中不能使用this。Vue 为了避免我们错误的使用,直接将 setup函数中的this修改成了 undefined)

2、setup 函数中的 props 是响应式的,当传入新的 props时,它将被更新。但是,因为 props 是响应式的,不能使用 ES6 解构,因为它会消除 props的响应性。

如果需要解构 props,可以通过使用 setup 函数中的toRefs 来完成此操作:

3、 setup()内使用响应式数据时,需要通过.value获取

4、从 setup() 中返回的对象上的 property 返回并可以在模板中被访问时,它将自动展开为内部值。不需要在模板中追加 .value

5、setup函数只能是同步的不能是异步的
 

七、main.js文件不同

Vue2:使用prototype(原型)的形式进行操作,引入的是构造函数。

Vue3: 需要使用结构的形式进行操作,引入的是工厂函数;vue3中app组件中可以没用根标签。



八、指令与插槽不同

Vue2:使用slot可以直接使用slot;v-for与v-if在vue2中优先级高的是v-for指令,而且不建议一起使用。

Vue3:不允许直接使用slot,正确格式为 v-slot;v-for与v-if只会把当前v-if当做v-for中的一个判断语句,不会相互冲突;移除了v-on.native修饰符;移除过滤器filter;

具名插槽使用方式不同:Vue2使用slot='',vue3使用v-slot:''

作用域插槽使用方式不同:Vue2中在父组件中使用slot-scope="data"从子组件获取数据,Vue3中在父组件中使用 #data 或者 #default="{data}"获取。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue2与Vue3的区别主要体现在以下几个方面: 1. TypeScript支持:Vue3相对于Vue2有更好的TypeScript支持。Vue2的Options API是一个简单的对象,而TypeScript是一种类型系统,面向对象的语法,两者不太匹配。因此,Vue2需要借助vue-class-component来增强原生组件,并且需要vue-property-decorator来增加更多与Vue特性结合的装饰器,写法相对繁琐。而Vue3由TypeScript重写,对TypeScript的支持更加友好。 2. Composition API:Vue3引入了Composition API,与Vue2的Options API相比,Composition API提供了更灵活、更可组合的方式来组织和重用代码。Composition API将组件的逻辑按照功能进行组织,而不是按照选项进行组织,使得代码更加清晰、易于维护。 3. 虚拟DOM优化:Vue3在虚拟DOM上增加了patchFlag字段,用于标记组件的更新类型,从而提高渲染性能。通过patchFlag的标记,Vue3可以更精确地知道哪些组件需要更新,避免不必要的DOM操作,提高了性能。 下面是一个示例,展示了Vue2和Vue3的区别: ```html <!-- Vue2 --> <template> <div> <h1>{{ title }}</h1> <p>{{ message }}</p> </div> </template> <script> export default { data() { return { title: 'Vue2', message: 'Hello Vue2!' } } } </script> <!-- Vue3 --> <template> <div> <h1>{{ title }}</h1> <p>{{ message }}</p> </div> </template> <script> import { reactive } from 'vue' export default { setup() { const data = reactive({ title: 'Vue3', message: 'Hello Vue3!' }) return { ...data } } } </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值