Vue 在收集依赖方面使用的是一个称为“依赖追踪”的机制。当 Vue 实例创建时,它会遍历数据对象的每一个属性并使用 Object.defineProperty 将其转换成 getter/setter,这样在访问或修改数据时,Vue 就能够捕捉到。
具体来说,当 Vue 实例渲染模板时,模板中的每个绑定的表达式都会调用对应属性的 getter。同时,在 getter 中,Vue 会收集依赖,将订阅者添加到依赖列表中去。
所谓的依赖追踪,即为了知道在数据变化时哪些地方需要进行更新。Vue 在 getter 中搜集依赖的方法是通过一个全局变量(比如 Dep.target)来标记当前正在进行依赖收集的订阅者,并且在 getter 执行完成后将其重置为 null,从而防止重复收集。
当数据发生修改时,Vue 就会触发 setter,setter 会通知之前收集到的所有订阅者进行更新。这样就实现了数据驱动视图的响应式效果。
总结起来,Vue 的依赖收集是通过在 getter 中订阅依赖(标记当前正在收集的订阅者),然后再在 setter 中通知依赖进行更新的机制。这样就能够保证当数据发生变化时,与之相关的视图会得到更新。