当前位置:首页 > 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 中,方法的实现通常通过 methods 选项完成。以下是 Vue 方法实现的核心要点和示例: 基本方法定义 在 Vue 组件中定义方法时,需将函数声明放在 methods 对象内。这些方…

vue实现triger

vue实现triger

在Vue中实现触发器(trigger)功能通常涉及自定义事件或DOM事件触发。以下是几种常见场景的实现方法: 自定义事件触发 通过$emit方法触发父组件中监听的自定义事件: // 子组件 t…

vue实现pie

vue实现pie

Vue 实现饼图 在 Vue 中实现饼图通常可以通过第三方图表库(如 ECharts、Chart.js 或 Highcharts)来完成。以下是使用 ECharts 和 Chart.js 的两种常见方…

vue 实现筛选

vue 实现筛选

实现筛选功能的基本方法 在Vue中实现筛选功能通常涉及以下几个核心步骤: 数据绑定与筛选逻辑 使用v-model绑定筛选条件到Vue实例的数据属性,结合计算属性实现动态筛选: data() {…

vue实现录像

vue实现录像

Vue 实现录像功能 在 Vue 中实现录像功能通常需要借助浏览器的 MediaDevices API 和 MediaRecorder API。以下是实现步骤: 获取用户摄像头和麦克风权限 使用…

vue实现影院

vue实现影院

Vue实现影院功能的基本思路 使用Vue框架开发影院功能需要结合前端组件化开发、状态管理以及后端API交互。以下是关键实现步骤: 影院页面布局设计 影院页面通常分为顶部导航栏、影院列表区域和底部导航…