Vue响应式更新的问题

vue响应式更新中,比如模板字符串{{a+b}}是把这个模板字符串new一个Watcher吗?这样获取Object. defineProperty中a和b的get中都添加这个watcher,还是比如说组件里面所有用到a的地方都是一个watcher,这样a改变的话就通知这一个watcher。这个我看vue源码中Dep.target设置为watcher的疑惑,在render中会new Watcher这样全局不就只有一个watcher了吗,怎么检测所有的变化?

vue在将数据转化成可观测数据时,是通过Object下的defineProperty的get和set,所有使用这个data的视图层相关都会通过get,从而被push进这个deep收集器中,在数据变化时,会通过set通知所有deep进行更新,每个视图层上的dom都会有一个自己的watcher,这些watcher都会被push到data相关的deep收集器中。

我想知道的是data中的每个属性值都有一个watcher吗?还是一个component只用一个watcher检测

每个属性值都有一个watcher

每个属性值都有一个watcher不浪费吗?比如{{a+b}}模板里面是一个表达式,我直接根据这个建立一个watcher不就可以监听两个值吗

是每个视图层上的dom元素有自己的watcher,每个data属性值有自己的deep,deep与watcher关系为 1:n

是这样啊,我一直以为watcher和watch里面监听的一样,都是监听一个属性。watcher是针对dom元素的啊

是拦截set操作,这样就知道属性值会改变,然后再去通知模板去刷新页面。

可能是我描述的不清楚,我的意思是假如一个组件使用一个watcher,当组件数据变化的时候会通知这个watcher去更新,watcher怎么去判断更新的是哪个具体的dom元素呢。

模板里面的插值呀,就是{{}}。

Vue 1 会在每个 bind 的地方加个 watcher,Vue 2 只给整个组件(实例)的模板加一个 watcher。或者换个方式理解,render 函数就相当于一个 $watch()