当前位置:首页 > VUE

vue watch的实现原理

2026-02-23 15:04:15VUE

Vue 中 watch 的实现原理

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

响应式依赖收集

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

// 简化版响应式实现
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 的更新,避免频繁触发回调。

vue watch的实现原理

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

总结

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

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

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

相关文章

vue前端实现注册

vue前端实现注册

使用 Vue 实现用户注册功能 环境准备 确保已安装 Vue CLI 或通过 CDN 引入 Vue。若使用 Vue CLI,需安装 axios 或其他 HTTP 库用于后端通信。 注册表单组件 创建…

vue实现压缩上传文件

vue实现压缩上传文件

压缩上传文件的实现方法 在Vue中实现文件压缩和上传功能,可以通过以下步骤完成。该方法结合了前端文件压缩库和HTTP请求,确保文件在上传前被有效压缩。 安装必要的依赖 需要使用compressorj…

vue播放倍速怎么实现

vue播放倍速怎么实现

实现Vue播放倍速的方法 在Vue中实现播放倍速功能通常涉及HTML5的<video>元素或第三方播放器库。以下是几种常见实现方式: 使用原生HTML5 video元素 通过ref获取v…

实现vue

实现vue

安装Vue.js 通过npm安装Vue.js是最常见的方式。确保已安装Node.js和npm,运行以下命令: npm install vue 或者使用CDN直接引入: <script src…

vue实现动画

vue实现动画

Vue 实现动画的方法 Vue 提供了多种方式来实现动画效果,包括内置的过渡系统、第三方动画库以及直接操作 CSS 或 JavaScript 动画。 使用 Vue 内置过渡系统 Vue 的 <…

vue拖动实现

vue拖动实现

实现 Vue 拖动功能的方法 使用 HTML5 拖放 API 在 Vue 中可以利用 HTML5 的原生拖放 API 实现拖动功能。通过 draggable 属性标记可拖动元素,结合 @dragsta…