当前位置:首页 > VUE

vue watch的实现原理

2026-02-23 15:04:15VUE

Vue 中 watch 的实现原理

Vue 的 watch 功能基于响应式系统,通过监听数据变化并触发回调函数实现。以下是其核心实现原理:

vue watch的实现原理

响应式依赖收集

Vue 的响应式系统通过 Object.definePropertyProxy 拦截数据的读写操作。当在 watch 中监听一个属性时,Vue 会将该属性添加到依赖列表中,并在属性变化时通知所有依赖的观察者。

vue watch的实现原理

// 简化版响应式实现
function defineReactive(obj, key, val) {
  const dep = new Dep(); // 依赖管理器
  Object.defineProperty(obj, key, {
    get() {
      if (Dep.target) {
        dep.addSub(Dep.target); // 收集依赖
      }
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      val = newVal;
      dep.notify(); // 触发更新
    }
  });
}

Watcher 的创建与调度

watch 的每个监听项会创建一个 Watcher 实例。当监听的数据变化时,Watcher 会执行回调函数。

class Watcher {
  constructor(vm, expOrFn, cb) {
    this.vm = vm;
    this.cb = cb;
    this.getter = parsePath(expOrFn); // 解析属性路径
    this.value = this.get(); // 触发依赖收集
  }

  get() {
    Dep.target = this; // 标记当前 Watcher
    const value = this.getter.call(this.vm, this.vm); // 触发 getter
    Dep.target = null; // 重置
    return value;
  }

  update() {
    const oldValue = this.value;
    this.value = this.get(); // 获取新值
    this.cb.call(this.vm, this.value, oldValue); // 执行回调
  }
}

深层监听与立即执行

  • 深层监听(deep):通过递归遍历对象的所有属性,为每个子属性添加 Watcher
  • 立即执行(immediate):在 Watcher 初始化时直接调用回调函数。
if (options.immediate) {
  cb.call(vm, watcher.value);
}
if (options.deep) {
  traverse(value); // 递归触发子属性的 getter
}

异步更新队列

Vue 通过异步队列(如 Promise.thensetTimeout)批量处理 Watcher 的更新,避免频繁触发回调。

function queueWatcher(watcher) {
  queue.push(watcher);
  nextTick(flushSchedulerQueue); // 异步执行更新
}

总结

  1. 依赖收集:通过响应式系统的 getter 收集 Watcher 依赖。
  2. 触发更新:数据变化时通过 setter 通知 Watcher 执行回调。
  3. 异步优化:使用队列机制合并多次更新,提升性能。
  4. 扩展功能:支持 deepimmediate 等配置项。

通过以上机制,watch 实现了高效、灵活的数据监听功能。

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

相关文章

vue实现triger

vue实现triger

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

vue实现效果

vue实现效果

以下是Vue实现常见效果的几种典型方法,分为不同场景说明: 数据绑定与响应式更新 使用v-model实现表单双向绑定: <template> <input v-model…

vue实现前端

vue实现前端

Vue 实现前端的核心方法与步骤 安装 Vue 项目 使用 Vue CLI 或 Vite 创建项目。Vue CLI 是传统构建工具,Vite 是新一代轻量级工具。 npm init vue@la…

vue实现曲线

vue实现曲线

Vue 实现曲线的方法 在 Vue 中实现曲线可以通过多种方式,包括使用 SVG、Canvas 或第三方库如 D3.js、ECharts 等。以下是几种常见的方法: 使用 SVG 绘制曲线 SVG…

vue实现 单选

vue实现 单选

实现 Vue 单选功能 在 Vue 中实现单选功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-model 绑定单选按钮 通过 v-model 可以轻松实现单选功能,将单选按钮的值绑定到…

vue实现树形

vue实现树形

Vue 实现树形组件 在 Vue 中实现树形结构通常需要递归组件和动态数据绑定。以下是实现树形组件的几种常见方法。 递归组件实现 递归组件是 Vue 中实现树形结构的核心方法。通过组件调用自身,可…