当前位置:首页 > 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 类实现监听逻辑:

  • 初始化阶段:在组件初始化时,遍历 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 3 的优化

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

示例代码

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

vue watch 实现 原理

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实现管道

vue实现管道

Vue 中实现管道(Pipe)功能 在 Vue 中可以通过过滤器(Filters)或计算属性(Computed Properties)实现类似管道的功能,将数据经过多个处理步骤后输出。 使用过滤器(…

vue实现公式

vue实现公式

在Vue中实现公式展示或计算可以通过多种方式实现,以下为具体方法: 使用模板插值与计算属性 若公式较简单,可直接在模板中使用插值表达式或计算属性。例如计算圆的面积: <templat…

vue实现通知

vue实现通知

Vue 实现通知功能的方法 使用 Vue 实现通知功能可以通过多种方式实现,以下是一些常见的方法: 使用 Vue 的全局事件总线 在 Vue 中可以通过事件总线实现通知功能。创建一个全局事件总线,然…

分页实现vue

分页实现vue

分页实现(Vue) 在Vue中实现分页功能通常需要结合前端分页逻辑和后端API支持。以下是两种常见的实现方式: 前端分页实现 适用于数据量较小的情况,直接在客户端完成分页逻辑。 <templ…

通过vue实现

通过vue实现

Vue 实现方法 安装 Vue 确保已安装 Node.js 和 npm,通过以下命令安装 Vue CLI: npm install -g @vue/cli 创建 Vue 项目 使用 Vue CLI…

vue实现博客

vue实现博客

Vue 实现博客的基本步骤 使用 Vue.js 实现一个博客系统可以分为前端和后端两部分。以下是基于 Vue 的前端实现方案,后端可以选择 Node.js、Django 或其他框架。 项目初始化 使…