vue原理之Watcher:vue的watch和$watch的原理,以及其背后new Watcher的流程

本文深入探讨Vue.js框架中的$watcher方法,详细解释其参数作用及内部实现流程,包括如何通过表达式或函数观察数据变化,以及如何在数据变动时触发相应watcher依赖。

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

$watcher方法的两个参数:

第一个参数两种可能:

  1. 传入被观察对象表达式(字符串),比如'a,b,c' , '$route'
  2. 如果表达式无法表示需要观察的内容,可以通过函数返回,比如:() => this.a + this.b

第一个参数干什么用的?
通过vue源码可得,new Watcher的流程:
第一步:拿到第一个参数,如果是函数,直接拿到函数,如果不是函数,转换为函数(parsePath),这个作为getter,先不调用,只备用

 // parse expression for getter
    if (typeof expOrFn === 'function') {
      this.getter = expOrFn
    } else {
      this.getter = parsePath(expOrFn)
      if (!this.getter) {
        this.getter = noop // noop就是空
      }
    }

第二步:调用Watcher类里的this.get

   this.value = this.lazy
      ? undefined
      : this.get()

第三步:康康this.get方法里有什么,这里第一句就是把当前watcher实例设置成Dep.target(姑且理解为全局变量),:

    pushTarget(this)

关于Dep.target:回忆一下,在definePropertyget里,是不是也用到了这Dep.target,对了!defineProperty里就是取这个Dep.target值,watcher只有一处取值,一处赋值,那么这个值在哪里赋上去的呢?对了!就是在这个pushTarget

第四步:Dep.target已经有值了,调用一下之前备用的getter(上面第一步),这样就能触发definePropertyget了,触发以后,就把这个watcher添加到get对应数据的deps依赖数组里了

    value = this.getter.call(vm, vm)

这样,再修改这个设置了defineProperty的响应式数据,就能触发这个数据绑定的所有watcher依赖了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值