通俗易懂的 Vue - Computed 原理(Watcher and Dep)

本文探讨Vue中computed属性的响应式原理,主要涉及Watcher和Dep对象的角色。在Vue实例初始化时,computed属性创建Watcher并收集依赖。当数据变化时,依赖的Dep通知对应的Watcher进行更新,完成数据重新计算。通过深入分析get方法和Dep的depend、addDep方法,揭示了computed如何实现数据依赖和更新的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家好,新人一个,初次写博客还请大家多多关照。

对于Vue的响应式,想必大家都有所了解,在Vue响应式数据中,computed 是比较特殊的响应式数据,它们可以监听使用到的 数据,数据 改变 computed 的数据也会重新计算。

今天主要是讨论 computed 实现原理 。 computed 在内部主要是运用 Watcher 和 Dep 构造函数进行收集依赖和派发更新。

咱们先来看看 Watcher 和 Dep 源码。

  var uid = 0;

  /**
   * dep 就是用来给每个数据做个标记,可以用来收集数据和派发更新
   */
  var Dep = function Dep () {
    this.id = uid++; 
//给每一个 Dep 打一个标记。这里需要说明一下,vm中data的每个数据进行初始化的时候都会调用this.dep = new Dep(),每一个数据都会有dep属性。
//(通过Observer 构造函数进行数据初始化,这里就不多说了,大家感兴趣可以看一下源码)
    this.subs = []; // 这个subs收集的是watcher,派发更新的时候遍历每个watcher调用update方法
  };

  Dep.prototype.addSub = function addSub (sub) {
    this.subs.push(sub);//这个方式是用来收集watcher的(每个computed构建出来的Watcher实例)
  };

  Dep.prototype.depend = function depend () {
    if (Dep.target) {
      Dep.target.addDep(this);  // 这里的方法是Watcher原型上的addDep方法,请看下面
    }
  };

  Watcher.prototype.addDep = function addDep (dep) {
    var id = dep.id;
    if (!this.depIds.has(id)) {
      this.depIds.add(id); //将依赖的每个dep,添加到 watcher 的 deps集合中,完成数据的收集
      this.depIds.push(dep);
    }
  };

  Dep.prototype.notify = function notify () { 
// 用来出发watcher的更新,每当数据改变,每个数据的dep就会出发
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值