1:vue2和vue3响应式原理发生了改变
vue2的双向数据绑定是利用ES5的一个APIObject.definePropert() 对数据进行劫持,结合发布订阅模式的方式来实现的。
vue3中使用了ES6的Proxy API对数据代理。
相比vue2.x,使用proxy的优势如下:
defineProperty只能监听某个属性,不能对全对象监听- 可以省去
for in,闭包等内容来提升效率(直接绑定整个对象即可) - 可以监听数组,不用再去单独的对数组做特异性操作
vue3.x可以检测到数组内部数据的变化。
2.Vue3支持碎片(Fragments)
template里头可以拥有多个根节点
3.Composition API
Vue2 与vue3 最大的区别是vue2使用选项类型api,对比vue3合成型api。旧得选项型api在代码里分割了不同得属性:data,computed,methods等;新得合成型api能让我们使用方法来分割,相比于旧的API使用属性来分组,这样代码会更加简便和整洁。
4.生命周期函数改变
生命周期钩子变化很大,其中beforeCreate和created都被删除,直接使用setup(),即开始创建组件之前,在beforeCreate和created之前执行,剩下的基本都是在最前面加了个on,如下:
beforeMount -> onBeforeMount,组件挂载到节点上之前执行的函数。
mounted -> onMounted,组件挂载完成后执行的函数。
beforeUpdate -> onBeforeUpdate,组件更新之前执行的函数。
updated -> onUpdated,组件更新完成之后执行的函数。
beforeDestroy -> onBeforeUnmount,组件卸载之前执行的函数。
destroyed -> onUnmounted,组件卸载完成后执行的函数
5.父子传参不同,setup()函数特性
setup()函数接收两个参数:props、context(包含attrs、slots、emit)
setup函数是处于生命周期beforeCreated和created俩个钩子函数之前
执行setup时,组件实例尚未被创建(在setup()内部,this不会是该活跃实例得引用,即不指向vue实例,Vue为了避免我们错误得使用,直接将setup函数中得this修改成了undefined)
与模板一起使用时,需要返回一个对象
因为setup函数中,props是响应式得,当传入新的prop时,它将会被更新,所以不能使用es6解构,因为它会消除prop得响应性,如需解构prop,可以通过使用setup函数中得toRefs来完成此操作。
父传子,用props,子传父用事件 Emitting Events。在vue2中,会调用this$emit然后传入事件名和对象;在vue3中得setup()中得第二个参数content对象中就有emit,那么我们只要在setup()接收第二个参数中使用分解对象法取出emit就可以在setup方法中随意使用了。
在setup()内使用响应式数据时,例如ref或者refs需要通过 .value 获取,reactive则可以直接获取
6.数据定义的地方不同
vue2.数据存放在data,方法在methods,通过this去调用。但是在vue3.x这些都没有了,所有的代码全部都在setup里面实现,你页面需要哪些方法,就要在当前页引入即可。
- 我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿。