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 | |||
| beforeMount | onBeforeMount | ||
| mounted | onMounted | 可以操作dom | |
| beforeUpdate | onBeforeUpdate | ||
| updated | onUpdated | ||
| beforeDestroy | onBforeUnmount | 做善后操作,比如清空全局计时器、清空绑定事件等 | |
| destroyed | onUnmounted |
3.更小
移除不常用的api,引入tree-shaking,打包的时候摇掉没用的模块,仅打包用到的,使打包的体积变小
4.更快
diff算法优化、事件监听缓存、静态提升、SSR优化,使得编译的更快。
- diff算法优化:会发生变化的地方添加标记,下次发生变化时直接找该地方进行比较。
- 事件监听缓存:vue2中每次渲染都会重新绑定事件,浪费资源,vue3在第一次渲染时对绑定事件进行缓存,后续渲染时重新使用。
- 静态提升:不参与更新的元素会做静态提升,只被创建一次,在渲染时直接复用。
5.更友好
相比vue2的optionsAPI,推出了compositionAPI,优化逻辑组织和逻辑复用,使业务功能更加高内聚低耦合,提高代码可读性。