一.vue响应式原理
无论是vue2.x 还是vue3.x,响应式原理都是一样的
- 侦测数据变化(数据劫持 / 数据代理)
- 收集视图依赖数据(依赖收集)
- 数据变化更新视图(发布订阅模式)
1.侦测数据
- vue2.x 使用了Object.defineProperty
- vue3.x使用了Proxy
Object.defineProperty的缺陷?
- 如果属性值也是对象,那么进行数据劫持就需要深度遍历了,这时候显然能够劫持完整对象更好
- 性能问题 :数组和对象,新增元素或属性 的时候,Object.defineProperty无法监听,需要人为手动更新实现监听
Proxy的优势?
- Proxy可以直接监听对象而非属性,并返回一个新对象
- Proxy可以直接监听数组的变化
2.收集视图依赖
为什么要收集依赖?
只有通过收集依赖
才能知道哪些地方依赖哪些数据,才能在数据更新时派发更新
。
怎样收集依赖?
通过订阅者 Dep,它用来收集依赖
、删除依赖
和向依赖发送
消息等
3.数据变化更新视图
引入观察者 Watcher
收集依赖收集的是观察者 Watcher,观察者Watcher收到数据变化的通知后再通知其他视图