当我精通vue2的源码dep和watcher的关系时

本文深入剖析Vue2的响应式原理、Watcher与Dep的工作机制、组件生命周期及渲染流程。介绍了如何通过Observer对数据进行响应式处理,Watcher在数据变化时如何触发更新,以及组件从挂载到渲染的全过程。

在这里插入图片描述

watcher与dep的关系程序运行分析

初始化执行 _init => initState() + vm.$mounted

initState => initData + initWatch + initComputed

  1. initData 中执行observer(),进行响应式处理
  • 创建Observer类 => Observer类中对data进行遍历defineReactive,修改get和set函数
  • defineReactive函数中创建私有变量dep(new Dep),每一个get和set对应一个dep
  • get中判断Dep类的静态属性target有值,当前watcher的deps添加当前dep,当前dep的subs添加当前watcher;并返回value;
  • set中赋值后执行dep.notify函数,执行dep的subs中的watcher循环update(执行queueWatcher=>flushWatcher=>延迟队列queue中watcher.run=>执行再次更新);
  1. initWatch
  • 截取watch的key属性和监听需要处理的handler函数
  • 对每一个key创建一个watcher,watcher函数中如果有user则获取到值后再次执行handler函数,实现监听功能
//            vm key handler
new Watcher(vm,exprOrfn,handler,{
   
   ...options,user:true}
  1. initComputed
  • 获取到所有computed属性的key,handler
  • 创建vm._computedWatcher,遍历赋值key:new Watcher
for(let key in computed){
   
   
    // getters 为computed的handler计算函数
    // lazy:true在watcher中区分时computed的属性,执行函数为计算函数
    // watcher中用dirty取初始化lazy,默认为true,表示第一次或者需要再次执行handler计算函数,为false读取缓存的值,即watcher的value
    _computedWatcher[key] = 
    new Watcher(vm
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值