监测机制的改变
vue2对数据监测使用的是Object.definePropert()对数据进行劫持,结合发布订阅者模式来实现
vue3通过使用proxyAPI对数据直接进行代理。
vue3优于vue3的的地方就是:
vue3的proxyAPI监测的是整个对象,而不再是某个属性
消除了 Vue 2 当中基于 Object.defineProperty 的实现所存在的很多限制
不用在单独对数组进行操作,可以监听到数组内的变化
支持碎片化
vue2只有一个根节点,不支持碎片化,在模板中如果使用多个根节点时会报错
vue3可以同时拥有多个根节点(Fragments),支持碎片化
API不同
vue2使用选项式API(Options API),选项型api在代码里分割了不同的属性:data,computed,methods等
vue3使用组合式API(Composition API),新的合成型api能让我们使用方法来分割,相比于旧的api使用属性来分组,这样代码会更加简便和整洁
vue3兼容了vue2的选项式API,也就是在vue3中可以使用选项式API,也可以使用组合式API
建立数据的方式不同
Vue2:这里把数据放入data属性中
Vue3:需要使用一个新的setup()方法,此方法在组件初始化构造的时候触发。使用以下三步来建立响应式数据:
从vue引入ref或reactive
简单数据类型使用ref()
方法处理,复杂类型数据用reactive()
处理
使用setup()
方法来返回
我们的响应性数据,从而我们的template
可以获取
这些响应性数据
生命周期不同
vue3的生命周期在调用之前需要先引入,vue的不需要
Vue2 Vue3
初始化阶段:
beforeCreate ------------------ setup()
created -------------------------- setup()
beforeMount -------------------- onBeforeMount
mounted -------------------------- onMounted
更新阶段:
beforeUpdate ------------------ onBeforeUpdate
updated ------------------------- onUpdated
activated ---------------------- onActivated
deactivated ------------------- onDeactivated
销毁阶段:
beforeDestroy ---------------- onBeforeUnmount
destroyed ---------------------- onUnmounted
父子传参不同
vue2中父子传参:父传子props,子传父$emit,调用$emit传入事件名和对象
vue3中父子传参:父传子props,子传父$emit,在setup函数中的第二个参数content对象中就有emit
因为vue3中没有this,所以vue3中的子传父 和vue2的略有区别,不过也更方便使用
指令与插槽不同
vue2中可以直接使用slot,v-for和v-if优先级v-for高,两者尽量不同时使用
vue3中必须使用v-slot的形式,v-for和v-if优先级v-if高,两者不冲突
defineProperty和proxy的区别
Vue 在实例初始化时遍历 data 中的所有属性,并使用 Object.defineProperty
把这些属性全部转为 getter/setter。并 劫持各个属性 getter 和 setter,在数据变化时发布消息给订阅者,触发相应的监听回调,而这之间存在几个问题
- 初始化时需要遍历对象所有 key,如果对象层次较深,性能不好
- 通知更新过程需要维护大量 dep 实例和 watcher 实例,额外占用内存较多
- Object.defineProperty 无法监听到数组元素的变化,只能通过劫持重写数方法
- 动态新增,删除对象属性无法拦截,只能用特定 set/delete API 代替
- 不支持 Map、Set 等数据结构
Vue3 使用 Proxy 来监控数据的变化。Proxy 是 ES6 中提供的功能,其作用为:用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)。相对于Object.defineProperty()
,其有以下特点:
- Proxy 直接代理整个对象而非对象属性,这样只需做一层代理就可以监听同级结构下的所有属性变化,包括新增属性和删除属性。
- 它的处理方式是在 getter 中去递归响应式,这样的好处是真正访问到的内部属性才会变成响应式,简单的可以说是按需实现响应式,减少性能消耗。
- Proxy 可以监听数组的变化