Vue3的响应式核心原理笔记
Vue2和Vue3响应式对比
-
Vue2响应式基于
Object.defineProperty
原理实现(观察者模式和发布/订阅模式)当创建
Vue
实例时,vue
会遍历data
选项的属性- 数据劫持:通过
Object.defineProperty
为属性添加getter
和setter
对数据的读取进行劫持 - 依赖收集:通过
getter
进行依赖收集 - 派发更新:通过
setter
进行派发更新
每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把“接触”过的数据 property 记录为依赖。之后当依赖项的 setter 触发时,会通知 watcher,从而使它关联的组件重新渲染。
- 数据劫持:通过
但是基于Object.defineProperty
特性无法检测未在data中声明的属性变化,并作出相应的更新
对象和数组都可以采用$set
的方式添加响应式的property
-
Vue3响应式原理是基于ES6的Proxy来实现
- 当一个值被读取时进行追踪:proxy 的
get
处理函数中track
函数记录了该 property 和当前副作用。 - 当某个值改变时进行检测:在 proxy 上调用
set
处理函数。 - 重新运行代码来读取原始值:
trigger
函数查找哪些副作用依赖于该 property 并执行它们。
- 当一个值被读取时进行追踪:proxy 的