当前位置:首页 > VUE

vue 代理实现原理

2026-01-19 03:29:17VUE

Vue 代理实现原理

Vue 的代理机制主要用于实现响应式系统,核心是通过 Object.definePropertyProxy 拦截对象属性的访问和修改,从而触发依赖收集和更新。

基于 Object.defineProperty 的实现

Vue 2.x 使用 Object.defineProperty 对对象的属性进行劫持。通过递归遍历对象的属性,将其转换为 getter/setter,在属性被访问或修改时触发依赖追踪和更新。

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get: function() {
      console.log('get:', key);
      return val;
    },
    set: function(newVal) {
      if (val === newVal) return;
      console.log('set:', key, newVal);
      val = newVal;
    }
  });
}

基于 Proxy 的实现

Vue 3.x 使用 Proxy 实现更强大的代理功能。Proxy 可以直接代理整个对象,无需递归遍历属性,且能拦截更多操作(如数组方法、属性删除等)。

const handler = {
  get(target, key) {
    console.log('get:', key);
    return Reflect.get(target, key);
  },
  set(target, key, value) {
    console.log('set:', key, value);
    return Reflect.set(target, key, value);
  }
};

const proxy = new Proxy({}, handler);

依赖收集与触发更新

无论是 Object.defineProperty 还是 Proxy,核心目标都是实现依赖收集和更新触发:

  • 依赖收集:在 getter 中记录当前正在执行的 Watcher。
  • 触发更新:在 setter 中通知所有依赖的 Watcher 执行更新。
// 简化的依赖收集逻辑
class Dep {
  constructor() {
    this.subscribers = new Set();
  }
  depend() {
    if (currentWatcher) {
      this.subscribers.add(currentWatcher);
    }
  }
  notify() {
    this.subscribers.forEach(watcher => watcher.update());
  }
}

总结

Vue 的代理实现原理是通过拦截对象属性的访问和修改,结合依赖收集机制,实现数据变化时的自动更新。Vue 2.x 使用 Object.defineProperty,而 Vue 3.x 升级为 Proxy,提供了更全面的拦截能力和性能优化。

vue 代理实现原理

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

相关文章

vue实现裁剪头像

vue实现裁剪头像

Vue 实现头像裁剪功能 实现头像裁剪功能通常需要结合第三方库如 cropperjs 或 vue-cropper。以下是两种常见实现方式: 使用 vue-cropper 库 安装依赖: n…

vue实现表格多行修改

vue实现表格多行修改

实现多行编辑表格 在Vue中实现表格的多行编辑功能,可以通过以下方法完成。这里以Element UI的表格组件为例,但思路适用于其他UI库或原生实现。 数据准备 定义表格数据和编辑状态管理变量:…

vue实现生成二维码

vue实现生成二维码

使用qrcode.vue库生成二维码 安装qrcode.vue库: npm install qrcode.vue --save 在Vue组件中使用: <template> <…

vue实现矩阵

vue实现矩阵

Vue 实现矩阵的方法 在 Vue 中实现矩阵操作可以通过多种方式完成,以下是一些常见的方法: 使用二维数组表示矩阵 矩阵可以用二维数组来表示,每个元素对应矩阵中的一个值。在 Vue 的 data…

vue实现点击

vue实现点击

实现点击事件的基本方法 在Vue中实现点击事件可以通过v-on指令或@简写方式绑定。以下是常见的点击事件绑定方法: <template> <button v-on:click…

vue广告实现

vue广告实现

Vue 广告实现方法 在 Vue 项目中实现广告功能可以通过多种方式完成,具体取决于广告类型和需求。以下是几种常见的实现方法: 使用第三方广告平台 许多广告平台如 Google AdSense…