Vue在那些情况下会进行依赖收集
组件初始化:当一个 Vue3 组件被创建并初次挂载时,框架会遍历组件模板中的数据绑定(如插值表达式 {{message}}
、指令 v-bind
、v-for
等),在这个过程中访问到的响应式属性会被记录为依赖。
计算属性(Computed Properties):计算属性的 getter 函数在首次执行时,会收集它所依赖的所有属性。
侦听器(Watchers):设置 watch
时,如果侦听的是一个函数,则在函数执行过程中访问到的响应式数据会被收集为依赖;如果侦听的是一个对象,Vue 会自动追踪该对象的变化。
Setup 函数:在 Composition API 中,setup
函数执行时,任何对响应式属性的访问都会触发依赖收集。
Vue3 的依赖收集机制基于 Proxy 和 Reflect,相较于 Vue2 使用的 Object.defineProperty,这是一种更为强大的数据劫持方式,能够更全面地监听对象属性的变化。以下是其核心要点:
响应式转换:Vue3 使用 reactive
或 ref
创建响应式对象或值,内部通过 Proxy 对象包裹原始数据,拦截对数据的各种访问(get/set)操作。
依赖收集处理器 track:当访问响应式数据时(即执行 Proxy 的 get 拦截器),Vue 会调用 track
函数。这个函数负责记录当前运行的“副作用”(副作用通常指的是组件渲染函数、计算属性的 getter 或者用户自定义的副作用函数)。它会将当前副作用与数据建立联系,形成依赖关系,这些依赖关系被储存在依赖图中。
派发更新处理器 trigger:当响应式数据发生变化时(即执行 Proxy 的 set 拦截器),Vue 会调用 trigger
函数。此函数负责检查哪些副作用函数依赖于该数据,进而执行这些函数来更新相关的DOM或计算属性值,触发组件的重新渲染或执行其他响应逻辑。
简而言之,Vue3 的依赖收集机制是通过 Proxy 在数据访问时自动追踪依赖,在数据变更时自动通知相关组件或函数重新执行,从而实现了自动化的数据绑定和界面更新。