1.响应式数据原理不同
1.vue2响应式数据的原理是利用es5中的Object.definePropert,该方法会劫持对象中的每一个属性的getter和setter方法,setter用于触发修改的回调函数,getter用于触发获取的回调函数
2.vue2响应式数据的缺点:
(1)如果对象的属性很多,需要给每个属性都绑定Object.definePropert方法,十分损耗效率
(2)无法对对象属性的新增和删除进行监听,所以在对对象进行新增属性和删除属性的操作时无法进行响 应式更新(该问题可以通过vue.set()解决)
(3)通过下标、length修改数组也无法进行响应式更新
3.vue3的响应式原理是利用es6的proxy代理和reflect,proxy可以劫持整个对象,拦截对象中任意属性的变化, 包括属性值的读写, 属性的添加, 属性的删除等操作,通过reflect(反射)被代理的对象, 属性进行操作。
2.vue2只有一个根节点,vue3可以有多个根节点(称之为碎片化节点)
3.vue2采用选项式API,vue3采用组合式API
4.生命周期的区别
| vue2 | vue3 |
|---|---|
| beforeCreate | setup |
| created | setup |
| beforeMount | onBeforeMount |
| mounted | onMounted |
| beforeUpdate | onBeforeUpdate |
| updated | onUpdated |
| beforeDestroy | onBeforeUnmount |
| destoryed | onUnmounted |
| activated | onActivated |
| deactivated | onDeactivated |
activated生命周期多用于缓存组件,即使用使用keep-alive包裹的组件,这种缓存组件的created和mounted两个生命周期只会触发一次,这种情况下又可能会无法满足我们的需求,而activated生命周期在缓存组件每一次进入的时候都会触发
onDeactivated生命周期会在缓存组件停止使用时触发
5.组件通信方式的区别
vue2和vue3父组件给子组件传值的方式基本相同,这里不多赘述 关于子组件给父组件传值则有些不同,我们知道,在vue2中可以通过this.$emit向父组件发送事件信息,但是在vue3 的setup钩子中this指向undefined,所以无法通过this使用emit。 解决方案:setup(props,context){} setup钩子有两个参数,context上下文中就包含了attrs、slots、emit、expose,可以使用context.emit向父组件传输事件信息。
<script setup>
在这种语法糖写法中,可以使用defineEmits()进行操作。