当前位置:首页 > VUE

vue 监听实现原理

2026-02-18 02:51:57VUE

Vue 监听实现原理

Vue 的监听机制主要依赖于响应式系统,通过 Object.definePropertyProxy 实现数据劫持,结合观察者模式(Observer/Watcher/Dep)完成依赖收集和派发更新。

vue 监听实现原理

核心实现

数据劫持

vue 监听实现原理

  • Vue 2.x 使用 Object.defineProperty 递归遍历对象的属性,将其转换为 getter/setter。
  • Vue 3.x 改用 Proxy 代理整个对象,无需递归初始化,性能更高。
// Vue 2.x 数据劫持示例
function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log('收集依赖');
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      console.log('触发更新');
      val = newVal;
    }
  });
}

依赖收集与派发更新

  • 每个响应式属性关联一个 Dep 实例(依赖管理器)。
  • 在 getter 中调用 dep.depend() 收集当前 Watcher(如模板渲染、计算属性等)。
  • 在 setter 中调用 dep.notify() 通知所有 Watcher 执行更新。
class Dep {
  constructor() {
    this.subs = [];
  }
  depend() {
    if (targetWatcher) {
      this.subs.push(targetWatcher);
    }
  }
  notify() {
    this.subs.forEach(watcher => watcher.update());
  }
}

监听 API 实现

watchcomputed

  • watch 通过创建 Watcher 实例,指定回调函数,当依赖变化时执行回调。
  • computed 是懒执行的 Watcher,依赖变化时标记为脏值,下次访问时重新计算。
// 简化的 Watcher 实现
class Watcher {
  constructor(vm, expOrFn, callback) {
    this.vm = vm;
    this.getter = parseExpression(expOrFn);
    this.callback = callback;
    this.value = this.get();
  }
  get() {
    pushTarget(this); // 设置当前 Watcher
    const value = this.getter.call(this.vm);
    popTarget();
    return value;
  }
  update() {
    const oldValue = this.value;
    this.value = this.get();
    this.callback.call(this.vm, this.value, oldValue);
  }
}

性能优化

  • 异步更新队列:Vue 将多次数据变更合并为一次 DOM 更新(通过 nextTick 实现)。
  • 组件级更新:每个组件对应一个渲染 Watcher,减少不必要的子组件更新。

通过以上机制,Vue 实现了高效的数据监听和视图更新。

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

相关文章

vue异步组建实现原理

vue异步组建实现原理

Vue 异步组件实现原理 Vue 的异步组件允许将组件按需加载,通常用于代码分割或延迟加载非关键组件。其核心原理基于 Promise 和动态导入。 基本实现方式 通过 defineAsyncComp…

vue实现引导

vue实现引导

Vue 实现引导功能的方法 使用第三方库 推荐使用 driver.js 或 intro.js 这类专门为 Vue 设计的引导库。这些库提供了完整的 API 和样式,能够快速实现引导功能。 安装 dr…

vue 实现跳转

vue 实现跳转

Vue 实现页面跳转的方法 在 Vue 中实现页面跳转通常可以通过以下几种方式实现,具体选择取决于项目需求和技术栈(如是否使用 Vue Router)。 使用 Vue Router 进行编程式导航…

vue实现反馈

vue实现反馈

Vue 实现反馈功能的方法 在 Vue 中实现反馈功能可以通过多种方式,包括弹窗提示、Toast 消息、表单提交等。以下是几种常见的实现方法。 弹窗反馈 使用 Vue 的组件化特性创建一个弹窗组件,…

vue工序实现

vue工序实现

Vue 工序实现方法 在Vue中实现工序(或流程)功能,通常涉及状态管理、组件通信和动态渲染。以下是几种常见方法: 使用动态组件 通过Vue的<component :is="currentCo…

vue实现双击

vue实现双击

Vue 实现双击事件的方法 在Vue中实现双击事件可以通过以下几种方式完成,具体选择取决于项目需求和开发习惯。 使用 @dblclick 指令 Vue提供了内置的@dblclick指令,可以直接在模…