Vue3 作为当前 Vue 的项目大势,开发当中需要注意区分 Vue2 与 Vue3 的区别以便切换新旧项目时可以流畅工作。记录一下 Vue2 与 Vue3 的区别总结笔记,温故知新。
Diff 算法 | 响应式原理
Diff 算法
一、Vue2 diff 算法
遍历每个虚拟节点,返回对比的 patch 对象
用 patch 更新 DOM 消耗性能,有不参与更新的元素
二、Vue3 diff 算法
初始化时给每个虚拟节点添加 patchFlags ,只比较 patchFlags 发生变化的节点,进行视图更新。
patchFlags 没有变化的元素作静态标记,渲染时直接复用
响应式原理
一、Vue2 Object.defineProperty()
实现原理
对象类型:
通过 Object.defineProperty()
对属性的读取、修改进行拦截(数据劫持)。
数组类型:
通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)。
Object.defineProperty(data, "count", {
get() {},
set() {},
});
存在问题
新增属性、删除属性, 界面不会更新。
直接通过下标修改数组, 界面不会自动更新。
解决方案
使用 Vue.set
、Vue.delete
或者 vm.$set
、vm.$delete
这些 API
数组:push()
、pop()
、shift()
、unshift()
、splice()
、sort()
、reverse()
二、Vue3 Proxy()
实现原理
通过 Proxy(代理)
拦截对象中任意属性的变化, 包括:属性值的读写、属性的添加、属性的删除等。
通过Reflect(反射)
对源对象的属性进行操作。
get set deleteProperty
Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。