vue3响应式原理解析
Vue3响应式方案
Vue3中使用了ES6提供的Proxy
来实现对数据的侦测.
- 可以监听属性的增删操作。
- 可以监听数组某个索引值的变化以及数组长度的变化
Proxy
Proxy
可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy
这个词的原意是代理,用在这里表示由它来“代理”某些操作,可以译为“代理器”。
具体知识可参考阮一峰老师的《ES6 入门教程》
1 | const proxy = new Proxy(target: object, handler: object) |
Reflect
Reflect
对象与Proxy
对象一样,也是 ES6 为了操作对象而提供的新 API
可以用来改写对象的某些方法,优化返回值
1 | const deeps = new Map() |
Set and WeakSet
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值
1 | const set = new Set([1, 2, 3]) |
Map and WeakMap
ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构
1 |
|
Vue3响应式原理
通过 effect 声明依赖响应式数据的函数cb ( 例如视图渲染函数render函数),并执行cb函数,执行过程中,会触发响应式数据 getter
在响应式数据 getter中进行 track依赖收集:建立 数据&cb 的映射关系存储于 targetMap
当变更响应式数据时,触发 trigger ,根据 targetMap 找到关联的cb执行
Vue3响应式实现
1 | // 建立响应式数据 |