当前位置:首页 > VUE

vue watch实现原理

2026-02-17 16:45:40VUE

Vue watch 实现原理

Vue 的 watch 机制用于监听数据变化并执行回调函数。其核心原理基于 Vue 的响应式系统和依赖收集机制。

响应式系统基础

Vue 通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现数据的响应式。当数据被访问时,会触发 getter 并收集依赖(Watcher 实例);当数据被修改时,会触发 setter 并通知依赖更新。

Watcher 类的作用

每个 watch 选项会创建一个 Watcher 实例。Watcher 的核心功能包括:

  • 在初始化时执行 getter 函数(通常是监听的数据的读取操作),触发依赖收集。
  • 当依赖的数据变化时,触发 update 方法,最终执行用户定义的回调函数。

深度监听的实现

当设置 deep: true 时,Vue 会递归遍历监听对象的所有属性,为每个子属性收集依赖。这样,任意层级的属性变化都能触发回调。

// 简化版的 Watcher 实现示例
class Watcher {
  constructor(vm, expOrFn, cb, options) {
    this.vm = vm;
    this.cb = cb;
    this.deep = !!options.deep;
    this.deps = [];
    if (typeof expOrFn === 'function') {
      this.getter = expOrFn;
    } else {
      this.getter = parsePath(expOrFn); // 解析路径,如 'a.b.c'
    }
    this.value = this.get();
  }

  get() {
    pushTarget(this); // 标记当前 Watcher 为正在收集的依赖
    const value = this.getter.call(this.vm, this.vm);
    if (this.deep) {
      traverse(value); // 递归遍历对象
    }
    popTarget(); // 结束依赖收集
    return value;
  }

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

异步更新队列

Vue 会将 Watcher 的更新推入异步队列(通过 nextTick 实现),避免频繁重复计算和 DOM 操作,提升性能。

与 computed 的区别

  • computed 是惰性求值,只有依赖变化且被访问时才重新计算。
  • watch 是主动监听,依赖变化时立即执行回调。

Vue 3 的改进

Vue 3 使用 Proxy 替代 Object.defineProperty,并引入 effectReactiveEffect 类替代 Watcher,但核心原理类似。

vue watch实现原理

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

相关文章

vue实现分屏

vue实现分屏

Vue 实现分屏的方法 分屏功能通常用于展示多个独立内容区域,以下是几种常见的实现方式: 使用 CSS Grid 布局 通过 CSS Grid 可以轻松创建分屏布局,在 Vue 组件中直接应用样式…

vue广告实现

vue广告实现

Vue 广告实现方法 在 Vue 项目中实现广告功能可以通过多种方式完成,具体取决于广告类型和需求。以下是几种常见的实现方法: 使用第三方广告平台 许多广告平台如 Google AdSense、百…

vue实现同步

vue实现同步

Vue 实现同步的方法 在 Vue 中实现同步操作通常涉及数据绑定、状态管理和异步操作的处理。以下是几种常见的方法: 使用计算属性(Computed Properties) 计算属性基于响应式依赖…

vue分类实现

vue分类实现

Vue分类实现方法 在Vue中实现分类功能通常涉及数据分组、动态渲染和交互逻辑。以下是几种常见的实现方式: 基于计算属性的分类 通过计算属性对原始数据进行分组处理,适合静态或少量数据分类: c…

vue实现盖章

vue实现盖章

Vue 实现盖章功能 在Vue中实现盖章功能通常涉及前端UI交互,通过Canvas或SVG绘制印章,并允许用户拖拽或点击放置印章。以下是具体实现方法: 使用Canvas绘制印章 通过HTML5的…

vue实现标签

vue实现标签

Vue 实现标签的方法 在 Vue 中实现标签功能可以通过多种方式完成,以下是几种常见的方法: 使用动态组件 动态组件可以根据不同的条件渲染不同的标签内容。通过 :is 属性动态绑定组件名,实现标签…