当前位置:首页 > VUE

vue watch实现过程

2026-02-17 16:46:56VUE

Vue 中 watch 的实现过程

Vue 的 watch 功能通过响应式系统的依赖收集和触发机制实现。以下是其核心实现逻辑:

初始化 watch

在组件初始化阶段,Vue 会遍历 watch 选项,为每个监听属性创建对应的 Watcher 实例。这个 Watcher 会被标记为用户 watchuser: true),区别于渲染 Watcher

vue watch实现过程

// 简化后的初始化逻辑
function initWatch(vm, watch) {
  for (const key in watch) {
    const handler = watch[key];
    createWatcher(vm, key, handler);
  }
}

创建 Watcher

Watcher 会解析监听的目标路径(如 a.b.c),并通过 getter 函数建立依赖关系。当被监听的值变化时,触发回调:

// 简化后的 Watcher 创建
new Watcher(vm, getter, callback, { user: true });

依赖收集过程

  1. 首次求值Watcher 会主动执行 getter 函数,访问被监听的数据,触发属性的 get 拦截器。
  2. 依赖记录:在 get 拦截器中,当前 Watcher 会被添加到属性的依赖列表(dep.subs)中。

触发更新

当被监听的数据被修改时:

vue watch实现过程

  1. 属性的 set 拦截器会通知所有依赖的 Watcher
  2. Watcher 执行回调函数,传入新值和旧值。
  3. 如果设置了 immediate: true,回调会在创建 Watcher 时立即执行一次。

深层监听实现

对于 deep: true 的监听:

  1. Watcher 会递归遍历对象的所有属性。
  2. 对每个子属性都触发 get 拦截器,强制收集依赖。
// 简化后的 deep 处理
function traverse(val) {
  if (isObject(val)) {
    for (const key in val) {
      traverse(val[key]);
    }
  }
}

异步队列处理

Vue 通过异步队列(nextTick)批量处理 watch 回调,确保:

  • 多次同步修改只会触发一次回调。
  • 回调执行时 DOM 已更新完毕(与渲染 Watcher 的执行顺序相关)。

与计算属性的区别

  • watch 是主动监听,适合执行副作用(如异步操作)。
  • 计算属性是基于缓存的被动计算,适合派生数据。

性能优化建议

  • 避免过度使用 deep,尤其是监听大型对象。
  • 对于需要监听多个属性的场景,考虑使用 computed 计算后再监听。
  • 必要时使用 unwatch 手动解除监听。

标签: 过程vue
分享给朋友:

相关文章

vue 实现菜单

vue 实现菜单

Vue 实现菜单的方法 使用 Vue 实现菜单可以通过多种方式,以下是几种常见的方法: 使用 Vue Router 实现动态路由菜单 通过 Vue Router 可以动态生成菜单,根据路由配置自动渲…

vue实现getapp

vue实现getapp

Vue 中实现全局获取应用实例的方法 在 Vue 3 中,可以通过 getCurrentInstance 方法获取当前组件实例,但需要明确其使用场景和限制。以下是具体实现方式: 方法一:通过 get…

vue实现验证

vue实现验证

Vue 表单验证实现方法 在Vue中实现表单验证可以通过多种方式完成,以下是常见的几种方法: 使用Vuelidate库 Vuelidate是一个轻量级的Vue表单验证库,安装后可以通过简单的配置实现…

vue实现通讯

vue实现通讯

Vue 组件通讯方法 父子组件通讯 父组件向子组件传递数据通过 props,子组件向父组件传递数据通过 $emit 事件。 父组件模板: <child-component :message=…

vue指令实现

vue指令实现

Vue 指令的实现方式 Vue 指令是特殊的标记,用于在 DOM 元素上应用特定的行为。可以通过全局或局部方式注册自定义指令。 全局注册指令 在 Vue 应用中通过 Vue.directive 方法…

vue广播实现

vue广播实现

vue广播实现 在Vue中实现广播功能可以通过事件总线(Event Bus)或Vuex来完成。以下是两种常见的实现方式: 使用事件总线(Event Bus) 事件总线是一种简单的跨组件通信方式,适用…