vue原理

Vue响应式原理Observer、Dep、Watcher理解

2020-03-27  本文已影响0人  FConfidence

Vue响应式原理Observer、Dep、Watcher理解

  1. Observer
class Observer {
  constructor() {
    // 响应式绑定数据通过方法
    observe(this.data);
  }
}

export function observe (data) {
  const keys = Object.keys(data);
  for (let i = 0; i < keys.length; i++) {
    // 将data中我们定义的每个属性进行响应式绑定
    defineReactive(obj, keys[i]);
  }
}
  1. Dep 管理依赖
  1. Watcher

Dep 如何收集依赖

  1. Object.defineProperty
    function defineReactive (obj, key, val) {
      let Dep; // 依赖
    
      Object.defineProperty(obj, key, {
        enumerable: true,
        configurable: true,
        get: () => {
          console.log('我被读了,我要不要做点什么好?');
          // 被读取了,将这个依赖收集起来
          Dep.depend(); // 本次新增
          return val;
        },
        set: newVal => {
          if (val === newVal) {
            return;
          }
          val = newVal;
          // 被改变了,通知依赖去更新
          Dep.notify(); // 本次新增
          console.log("数据被改变了,通知所有的wather去调用update!");
        }
      })
    }
    

什么是依赖 ? (Watcher)

  1. Watcher就是类似观察者的角色,比如message就有三个观察者,当message变化,就通知这三个观察者,他们就去执行各自需要做的变化 watcher.update()。

  2. 可以推测出,Watcher必须要有的2个方法。一个就是通知变化,另一个就是被收集起来到Dep中去。

    class Watcher {
      addDep() {
        // 我这个Watcher要被Observer塞到Dep里去了~~
      },
      update() {
        // Dep通知我更新呢~~
      }, 
    }
    

总结

  1. Vue响应式原理的核心就是Observer、Dep、Watcher。

  2. Observer中进行响应式的绑定,在数据被读的时候,触发get方法,执行Dep来收集依赖,也就是收集Watcher。

  3. 在数据被改的时候,触发set方法,通过对应的所有依赖(Watcher),去执行更新。比如watch和computed就执行开发者自定义的回调方法。

上一篇下一篇

猜你喜欢

热点阅读