当前位置:首页 > VUE

vue 监听实现原理

2026-03-09 15:37:45VUE

Vue 监听实现原理

Vue 的监听机制主要依赖于响应式系统和依赖收集,核心是通过 Object.defineProperty 或 ES6 的 Proxy 实现数据劫持,结合发布-订阅模式完成数据与视图的绑定。

响应式数据劫持

对于对象属性,Vue 2.x 使用 Object.defineProperty 将属性转为 getter/setter,在 getter 中收集依赖(Watcher),在 setter 中触发更新。Vue 3.x 改用 Proxy 代理整个对象,拦截更全面(如数组变化、新增属性)。

vue 监听实现原理

// Vue 2.x 简化实现
function defineReactive(obj, key) {
  let value = obj[key];
  const dep = new Dep(); // 依赖收集器
  Object.defineProperty(obj, key, {
    get() {
      if (Dep.target) dep.depend(); // 收集当前 Watcher
      return value;
    },
    set(newVal) {
      if (newVal === value) return;
      value = newVal;
      dep.notify(); // 通知更新
    }
  });
}

依赖收集与派发更新

每个响应式属性关联一个 Dep 实例(依赖收集器)。当组件渲染时,触发属性的 getter,将当前 Watcher(渲染器或用户自定义 watcher)存入 Dep 中。属性变化时,通过 setter 触发 Dep.notify(),通知所有 Watcher 执行更新。

class Dep {
  constructor() {
    this.subs = [];
  }
  depend() {
    this.subs.push(Dep.target);
  }
  notify() {
    this.subs.forEach(watcher => watcher.update());
  }
}

Watcher 的作用

Watcher 是观察者,分为渲染 Watcher(组件更新)、计算属性 Watcher 和用户自定义 Watcher(watch 选项)。初始化时通过 get() 方法主动触发依赖收集,后续数据变化时通过 update() 触发重新计算或渲染。

vue 监听实现原理

class Watcher {
  constructor(vm, expOrFn, cb) {
    this.vm = vm;
    this.getter = parsePath(expOrFn);
    this.cb = cb;
    this.value = this.get();
  }
  get() {
    Dep.target = this; // 标记当前 Watcher
    const value = this.getter.call(this.vm, this.vm);
    Dep.target = null; // 收集完成后清除
    return value;
  }
  update() {
    this.run();
  }
  run() {
    const value = this.get();
    if (value !== this.value) {
      this.cb.call(this.vm, value, this.value);
    }
  }
}

异步更新队列

Vue 通过异步队列(如 Promise.thenMutationObserver)批量处理数据变更的 Watcher 更新,避免重复渲染。同一事件循环内的多次数据修改只会触发一次组件更新。

function queueWatcher(watcher) {
  if (!flushing) {
    queue.push(watcher);
  }
  nextTick(flushSchedulerQueue); // 下一 tick 执行更新
}

总结

Vue 的监听实现核心是:

  • 数据劫持拦截读写操作
  • 依赖收集建立数据与 Watcher 的关联
  • 派发更新时通过异步队列优化性能
  • 结合虚拟 DOM 差异更新实现高效渲染

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

相关文章

vue 实现递归

vue 实现递归

Vue 实现递归组件的方法 在 Vue 中实现递归组件通常用于处理树形结构数据,例如菜单、评论列表或文件目录。以下是实现递归组件的关键步骤: 定义递归组件 递归组件需要设置 name 属性,以便在模…

vue实现全屏

vue实现全屏

Vue 实现全屏功能的方法 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 来实现。以下是几种常见的实现方式: 使用原生 Fullscreen API 通过调用 doc…

vue实现oauth

vue实现oauth

Vue 实现 OAuth 的步骤 安装必要的依赖 确保项目中安装了 axios 和 vue-router。OAuth 通常需要发送 HTTP 请求和处理路由跳转。 npm install axios…

实现vue cli

实现vue cli

安装 Vue CLI 确保系统中已安装 Node.js(版本建议 12.x 或更高)。通过 npm 全局安装 Vue CLI: npm install -g @vue/cli 安装完成后验证版本:…

vue核心实现

vue核心实现

Vue 核心实现原理 Vue.js 的核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是关键实现原理的详细说明: 响应式系统 Vue 使用 Object.defineProper…

vue实现白板

vue实现白板

Vue实现白板功能 使用Vue实现白板功能可以通过HTML5的Canvas API结合Vue的响应式特性来完成。以下是实现白板功能的关键步骤: 安装依赖 在Vue项目中安装必要的依赖,如vue-dr…