当前位置:首页 > VUE

vue监听实现原理

2026-03-10 01:06:54VUE

Vue 监听实现原理

Vue 的监听机制主要依赖于 Object.definePropertyProxy(Vue 3+)来实现数据的响应式。以下是核心实现原理:

数据劫持

通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)劫持数据的读取和修改操作。当数据被访问或修改时,触发对应的 getter 和 setter。

// Vue 2 实现
Object.defineProperty(obj, key, {
  get() {
    // 依赖收集
    return val;
  },
  set(newVal) {
    // 触发更新
    val = newVal;
  }
});

依赖收集

在 getter 中,通过 Dep 类收集当前正在执行的 Watcher(依赖)。每个响应式属性都有一个对应的 Dep 实例,用于管理所有依赖它的 Watcher

class Dep {
  constructor() {
    this.subs = [];
  }
  addSub(sub) {
    this.subs.push(sub);
  }
  notify() {
    this.subs.forEach(sub => sub.update());
  }
}

派发更新

在 setter 中,当数据变化时,通过 Dep.notify() 通知所有依赖的 Watcher 执行更新。Watcher 会重新计算或触发组件的重新渲染。

set(newVal) {
  if (val === newVal) return;
  val = newVal;
  dep.notify(); // 通知更新
}

异步更新队列

Vue 通过异步队列(如 nextTick)优化多次数据变更的更新。同一事件循环内的多次数据修改会合并为一次更新,避免不必要的重复渲染。

queueWatcher(watcher) {
  // 将 Watcher 加入队列,异步执行
  nextTick(flushSchedulerQueue);
}

Vue 3 的改进

Vue 3 使用 Proxy 替代 Object.defineProperty,解决了 Vue 2 中无法监听数组索引和对象新增属性的问题。Proxy 可以直接拦截整个对象的操作,无需递归遍历属性。

vue监听实现原理

// Vue 3 实现
const proxy = new Proxy(obj, {
  get(target, key) {
    track(target, key); // 依赖收集
    return target[key];
  },
  set(target, key, value) {
    target[key] = value;
    trigger(target, key); // 触发更新
    return true;
  }
});

总结

  • Vue 2 通过 Object.defineProperty 实现数据劫持,结合 DepWatcher 完成依赖收集与派发更新。
  • Vue 3 使用 Proxy 提供更全面的拦截能力,优化响应式系统的性能和功能。

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

相关文章

vue实现双折线图

vue实现双折线图

实现双折线图的步骤 安装必要的依赖库(如 ECharts 或 Chart.js),这里以 ECharts 为例: npm install echarts --save 在 Vue 组件中引入 ECh…

vue实现建模

vue实现建模

Vue 实现建模的方法 在 Vue 中实现建模通常涉及数据绑定、组件化和状态管理。以下是几种常见的方法: 数据驱动建模 Vue 的核心是数据驱动视图。通过定义数据模型,Vue 会自动更新 DOM。例…

vue实现图册

vue实现图册

Vue实现图册功能 在Vue中实现图册功能通常涉及图片展示、切换、缩放等交互效果。以下是常见的实现方法和关键代码示例: 基础图册组件结构 使用Vue单文件组件构建基础结构: <templat…

vue实现xterm

vue实现xterm

在 Vue 中集成 Xterm.js Xterm.js 是一个基于 TypeScript 的前端终端组件库,可用于在浏览器中实现终端功能。以下是在 Vue 项目中集成 Xterm.js 的详细步骤。…

vue实现dag

vue实现dag

Vue实现DAG(有向无环图) 在Vue中实现DAG(Directed Acyclic Graph,有向无环图)通常涉及数据结构的建模、可视化渲染以及交互逻辑处理。以下是关键实现步骤和示例代码: 数…

vue实现白板

vue实现白板

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