当前位置:首页 > VUE

vue 监听实现原理

2026-02-18 02:51:57VUE

Vue 监听实现原理

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

核心实现

数据劫持

  • 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中实现活动倒计时通常需要获取当前时间与活动结束时间的差值,并将其转换为天、小时、分钟、秒的格式展示。通过定时器每秒更新显示的时间。 定义倒计时数据 在Vue组件的d…

vue实现store

vue实现store

Vue 实现 Store 在 Vue 中,可以通过 Vuex 或 Pinia 实现全局状态管理(Store)。以下是两种主流方案的实现方法。 使用 Vuex 实现 Store Vuex 是 Vue…

eventbus vue实现

eventbus vue实现

EventBus 实现原理 EventBus 是一种发布/订阅模式,用于 Vue 组件间的通信。核心是通过一个中央事件总线管理事件监听和触发。 创建 EventBus 在 Vue 项目中创建一个独立…

实现vue模版

实现vue模版

Vue 模板的基本结构 Vue 模板基于 HTML 语法,通过 Vue 的指令和插值实现动态渲染。以下是一个基础模板示例: <template> <div id="app…

vue怎么实现

vue怎么实现

Vue 实现方法 Vue 是一个流行的前端框架,用于构建用户界面。以下是几种常见的实现方法: 数据绑定 使用 v-model 指令实现双向数据绑定,适用于表单输入元素。 <input v…

vue实现handsontable

vue实现handsontable

Vue 中实现 Handsontable 要在 Vue 项目中集成 Handsontable,可以使用官方提供的 @handsontable/vue 封装库。以下是一个完整的实现步骤。 安装依赖…