Vue依赖更新原理分析

依赖更新分为两步

  1. 修改属性值
  2. 通知之前收集到的依赖,进行更新

dep主要用来存储依赖

var Dep = function() {
    this.subs = [];
}
Dep.prototype.notify = function() {
    var subs = this.subs.slice();
    for (var i = 0; i < subs.length; i++) {
        // 遍历依赖存储器,然后一个个调用`watcher.update`
        subs[i].update();
    }
}

watcher.update中到底发生了什么?可以来具体看一下Watcher类的源码

function Watcher(vm, expOrFn) {
    this.vm = vm;
    // 保存更新函数
    this.getter = expOrFn;
    // 新建watcher的时候立即执行更新函数
    this.get();
}
Watcher.prototype.get = function() {
    this.getter.call(this.vm, vm);
}
Watcher.prototype.update = function() {
    this.get();
}

那Watcher是什么时候,传入这个更新函数的,其实各个类型的Watcher都不一样,以页面watcher举例

Vue.prototype.$mount = function() {
    ...解析template成redner函数保存
    /** 每个实例新建一个watcher,
           并且利用watcher 保存更新函数 **/
    new Watcher(this,        
        // 这个函数是更新函数,传入watcher保存下来,用于后面页面初始化或者页面更新
        function() {
            ...调用保存的渲染函数生成VNode,
                          并生成DOM插入页面中
        }
    );
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值