回答一
vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的。
- vue会遍历此data中对象所有的属性
- 并使用
Object.defineProperty
把这些属性全部转为gettter/setter
- 而每个组件实例都有watcher对象
- 会在组件渲染过程中把属性记录为依赖
- 当依赖项的
setter
被调用时,会通知watcher重新计算,从而使它关联的组件得以更新
回答二(推荐)
- 在生命周期的
initState 方法
中将data、prop、method、computed、watch
中的数据劫持,通过observe方法
与Object.defineProperty方法
将相关对象转换为Observer
对象。 - 然后在
initRender
方法中解析模版,通过Watcher对象
,Dep对象与观察者模式将模板中的 指令与对象的数据建立依赖关系,使用全局对象Dep.target
实现依赖收集。 - 当数据变化时,
setter
被调用,触发Object.defineProperty方法
中的dep.notify方法
,遍历该数据依赖列表,执行器update方法
通知Watcher进行视图更新。
vue是无法检测到对象属性的添加和删除,但是可以使用全局Vue.set方法(或vm. $set实例方法)。
vue无法检测利用索引设置数组,但是可以使用全局Vue.set方法(或vm. $set实例方法)。
无法检测直接修改数组长度,但是可以使用splice