当前位置:首页 > VUE

vue监听实现原理

2026-02-18 11:51:56VUE

Vue 监听实现原理

Vue 的监听机制主要通过 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)实现数据响应式。以下是核心原理的详细分析:

vue监听实现原理

数据劫持(Vue 2.x)

Vue 2.x 使用 Object.defineProperty 劫持对象的属性访问和修改。通过为每个属性设置 gettersetter,在数据变化时触发依赖更新。

vue监听实现原理

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log('读取属性', key);
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        console.log('更新属性', key);
        val = newVal;
        // 触发依赖更新
        dep.notify();
      }
    }
  });
}
  • 依赖收集:在 getter 中,当前正在执行的 Watcher(如组件渲染函数)会被添加到依赖列表(Dep)中。
  • 派发更新:在 setter 中,通知所有依赖的 Watcher 执行更新。

代理模式(Vue 3.x)

Vue 3.x 改用 Proxy 实现更强大的响应式能力。Proxy 可以直接监听整个对象而非属性,并支持动态新增属性的监听。

const reactive = (target) => {
  return new Proxy(target, {
    get(target, key, receiver) {
      track(target, key); // 依赖收集
      return Reflect.get(target, key, receiver);
    },
    set(target, key, value, receiver) {
      Reflect.set(target, key, value, receiver);
      trigger(target, key); // 派发更新
      return true;
    }
  });
};
  • 优势:无需递归遍历对象属性,性能更好;支持监听数组索引和 length 变化。

依赖管理

  • Dep 类:每个响应式属性对应一个 Dep 实例,用于存储所有依赖的 Watcher
  • Watcher 类:代表一个依赖(如组件渲染函数、计算属性),在数据变化时执行回调。
class Dep {
  constructor() {
    this.subscribers = new Set();
  }
  depend() {
    if (activeWatcher) this.subscribers.add(activeWatcher);
  }
  notify() {
    this.subscribers.forEach(watcher => watcher.update());
  }
}

数组监听的特殊处理

Vue 2.x 通过重写数组的变异方法(如 pushpop)实现监听:

const arrayProto = Array.prototype;
const arrayMethods = Object.create(arrayProto);
['push', 'pop', 'shift'].forEach(method => {
  const original = arrayProto[method];
  arrayMethods[method] = function(...args) {
    const result = original.apply(this, args);
    dep.notify(); // 手动触发更新
    return result;
  };
});

总结

  • Vue 2.x 基于 Object.defineProperty,需显式声明响应式属性,对数组需特殊处理。
  • Vue 3.x 基于 Proxy,支持全对象监听,性能更优,代码更简洁。
  • 依赖收集和派发更新通过 DepWatcher 协作完成。

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

相关文章

vue设计与实现 书

vue设计与实现 书

vue设计与实现 书 《Vue.js设计与实现》是一本深入探讨Vue.js框架内部原理和设计思想的书籍,适合希望深入理解Vue.js的开发者。以下是关于这本书的详细信息: 书籍内容 《Vue…

vue实现visual

vue实现visual

Vue 实现可视化(Visual)的常见方法 在 Vue 中实现可视化通常涉及数据可视化库的集成,以下是几种主流方案: 使用 ECharts ECharts 是一个强大的 JavaScript…

vue  select实现

vue select实现

Vue Select 实现方法 在 Vue 中实现下拉选择功能可以使用原生 <select> 标签或第三方库如 vue-select。以下是两种方法的详细说明: 原生 HTML Sel…

vue列表实现

vue列表实现

Vue 列表实现方法 使用 v-for 指令 v-for 是 Vue 中用于渲染列表的核心指令,基于数据源动态生成 DOM 元素。语法格式为 item in items 或 (item, index)…

vue实现jqueryui

vue实现jqueryui

Vue 实现 jQuery UI 功能 在 Vue 项目中实现类似 jQuery UI 的功能,可以通过原生 Vue 组件或第三方库来实现。以下是几种常见 jQuery UI 功能的 Vue 替代方案…

vue实现全景

vue实现全景

Vue 实现全景效果的方法 使用 Vue 实现全景效果通常需要结合第三方库或框架,以下是几种常见的方法: 使用 Three.js 和 Vue-Three.js Three.js 是一个强大的 3D…