vue2和vue3的区别

123 阅读2分钟

1.响应式原理

vue2使用ES5的Object.defineProperty()来深度遍历对象的所有属性,把每个属性变成getter和setter函数,读取属性的时候调用getter,修改属性的时候调用setter,来实现响应式,响应式数据写在data()函数中,vue2无法监听对象和数组属性的添加和删除,要用set和delete方法来实现对象和数组新增和删除的响应式。

vue3使用ES6的Proxy对对象进行代理,监听整个对象,实现响应式,响应式数据用ref和reactive定义,ref定义基本数据类型,reactive定义引用数据类型,已经定义的reactive重新赋值一个新对象或者将对象传入函数时会丢失响应式,所以推荐使用ref。Proxy还可以检测到对象和数组内部数据的变化。

2.生命周期

vue2生命周期vue3生命周期作用
beforeCreate可以做初始化相关操作,请求数据
created
beforeMountonBeforeMount
mountedonMounted可以操作dom
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeDestroyonBforeUnmount做善后操作,比如清空全局计时器、清空绑定事件等
destroyedonUnmounted

3.更小

移除不常用的api,引入tree-shaking,打包的时候摇掉没用的模块,仅打包用到的,使打包的体积变小

4.更快

diff算法优化、事件监听缓存、静态提升、SSR优化,使得编译的更快。

  • diff算法优化:会发生变化的地方添加标记,下次发生变化时直接找该地方进行比较。
  • 事件监听缓存:vue2中每次渲染都会重新绑定事件,浪费资源,vue3在第一次渲染时对绑定事件进行缓存,后续渲染时重新使用。
  • 静态提升:不参与更新的元素会做静态提升,只被创建一次,在渲染时直接复用。

5.更友好

相比vue2的optionsAPI,推出了compositionAPI,优化逻辑组织和逻辑复用,使业务功能更加高内聚低耦合,提高代码可读性。

6.v-if优先级高于v-for

7.template模板支持多个根节点

8.对ts的支持性更好,因为是用ts写的,可以进行更复杂的类型判断