当前位置:首页 > VUE

vue watch 实现 原理

2026-03-08 07:46:44VUE

Vue watch 的实现原理

Vue 的 watch 机制基于响应式系统,通过依赖收集和派发更新实现数据变化的监听。以下是其核心实现原理:

依赖收集与响应式系统

Vue 的响应式系统通过 Object.definePropertyProxy(Vue 3)劫持数据对象的属性访问和修改。当在组件中定义 watch 时,Vue 会将 watcher 实例添加到当前属性的依赖列表中。

  • Getter 触发依赖收集:首次访问被监听的数据时,触发 getter,将当前 watcher 添加到依赖列表。
  • Setter 触发更新:数据变化时触发 setter,通知所有依赖的 watcher 执行回调。

Watcher 类

Vue 内部通过 Watcher 类实现监听逻辑:

vue watch 实现 原理

  • 初始化阶段:在组件初始化时,遍历 watch 选项,为每个监听属性创建对应的 Watcher 实例。
  • 回调执行:当数据变化时,watcher 会执行用户定义的回调函数,并传入新旧值。

深度监听实现

当设置 deep: true 时,Vue 会递归遍历对象的所有属性,为每个子属性绑定监听:

traverse(value) {
  if (isObject(value)) {
    Object.keys(value).forEach(key => {
      traverse(value[key])
    })
  }
}

立即执行与回调调度

若设置 immediate: true,Vue 会在 watcher 创建后立即执行一次回调。通过 scheduler 控制回调的执行时机,例如在 nextTick 中批量处理更新。

vue watch 实现 原理

Vue 3 的优化

Vue 3 使用 Proxy 替代 Object.defineProperty,并引入 effectReactiveEffect 类重构响应式系统。watch API 通过 effect 自动跟踪依赖,性能更高。

示例代码

以下是简化的 watcher 实现逻辑:

class Watcher {
  constructor(vm, expOrFn, cb, options) {
    this.vm = vm
    this.cb = cb
    this.deep = !!options.deep
    if (typeof expOrFn === 'function') {
      this.getter = expOrFn
    } else {
      this.getter = parsePath(expOrFn)
    }
    this.value = this.get()
  }

  get() {
    pushTarget(this) // 将当前 watcher 设置为全局活动 watcher
    const value = this.getter.call(this.vm, this.vm)
    if (this.deep) traverse(value) // 深度监听
    popTarget() // 恢复之前的 watcher
    return value
  }

  update() {
    const oldValue = this.value
    this.value = this.get()
    this.cb.call(this.vm, this.value, oldValue)
  }
}

关键点总结

  • 基于响应式系统的 getter/setter 或 Proxy 实现数据监听。
  • 每个 watch 对应一个 Watcher 实例,通过依赖收集关联数据与回调。
  • 深度监听通过递归遍历对象属性实现。
  • Vue 3 的 watch 利用 Composition API 的 effect 机制,实现更细粒度的依赖跟踪。

标签: 原理vue
分享给朋友:

相关文章

vue实现triger

vue实现triger

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

vue功能实现

vue功能实现

Vue 功能实现指南 Vue.js 是一个渐进式 JavaScript 框架,广泛用于构建用户界面。以下是 Vue 功能的常见实现方法。 数据绑定 Vue 的核心功能之一是数据绑定,通过 v-mod…

vue页面实现

vue页面实现

Vue 页面实现方法 创建 Vue 组件 使用 Vue 单文件组件(SFC)方式创建页面,文件扩展名为 .vue。一个基本的 Vue 组件包含三个部分:模板(template)、脚本(script)和…

vue 实现视频

vue 实现视频

Vue 实现视频播放功能 使用 Vue 实现视频播放功能可以通过 HTML5 的 <video> 标签或第三方库(如 video.js)来实现。以下是两种常见的方法: 使用 HTML5…

vue 实现拖拉

vue 实现拖拉

Vue 实现拖拽功能的方法 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dr…

vue ref实现

vue ref实现

Vue 中 ref 的实现 在 Vue 中,ref 是一个用于创建响应式引用的 API,适用于基本类型和对象。以下是 ref 的核心实现原理和使用方法。 基本实现原理 ref 通过 Reactive…