1.Composition API(组合式API):
Vue2中,只能固定使用data,computed,methods等选项组织代码 组件复杂的时候,一个功能的相关属性和方法就会到处都是,很难维护。Composition API可以让我们自由组织代码,同一功能的全部放在一起,代码便于维护。
2.setup():
setup(props,context) { return ...}
setup里面不能使用this,context对象来代替当前执行上下文绑定的对象
语法糖
3.watchEffect
watch第一次不会执行,只有当值变化时才会重新执行
watchEffect传入了一个立即执行函数,默认第一次也会执行一次,
不需要传入监听内容,会自动手机函数内的数据作为依赖,依赖变化的
时候就会执行,没有依赖就不会执行,不会返回新老值
4.数据响应式的改变
Vue2是通过Object.defineProperty()劫持各个属性的getter和setter,
在数据变化的时候发布消息给订阅者,触发对应的回调
问题:
初始化需要遍历对象的所有key,对象层次深,性能不好;
通知更新过程需要维护大量的dep实例和watcher实力,占用额外内存多
无法监听到数组元素的变化
不支持Map,Set等数据结构
Vue3中使用了proxy,解决了上面的一系列问题 proxy是ES6的方法,defineProperty是劫持对象属性,proxy是代理整 个对象 defineProperty会污染原对象,proxy修改的是代理对象
5.Diff算法的优化
Vue2 是全量 Diff
Vue3 是静态标记 + 非全量 Diff(Vue3跳过了永远不会变化的节点)
使用最长递增子序列优化了对比流程
力扣算法题--最长递增子序列
以数组[2, 11, 6, 8, 1]为例:最终输出的结果为[0, 2, 3],表示最强增长序列的索引分别是0,2,3;
对应的值是2,6,8
使用这个的目的是什么呢?
Vue2在DOM-Diff过程中,优先处理特殊场景的情况,即头头比对,头尾比对,尾头比对等。
而Vue3在DOM-Diff过程中,根据 newIndexToOldIndexMap 新老节点索引列表找到最长
稳定序列,通过最长增长子序列的算法比对,找出新旧节点中不需要移动的节点,原地复用,
仅对需要移动或已经patch(新增删除节点等操作)节点进行操作,最大限度地提升替换效率,相比于Vue2版本是质的提升