当前位置:首页 > VUE

vue 代理实现原理

2026-01-19 03:29:17VUE

Vue 代理实现原理

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

vue 代理实现原理

基于 Object.defineProperty 的实现

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

vue 代理实现原理

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实现这一效果主要依赖组件化开发、CSS定位和动态数据绑定。 组件结构设计 创建一个独立的Vue组件…

vue实现过滤

vue实现过滤

Vue实现过滤的方法 在Vue中实现数据过滤可以通过多种方式完成,以下是几种常见的方法: 使用计算属性过滤 计算属性是Vue中处理数据过滤的理想选择,它们基于响应式依赖进行缓存,只有在相关依赖发生改…

vue 全景实现

vue 全景实现

Vue 全景实现方案 在Vue中实现全景效果,通常需要结合WebGL或第三方库来处理3D场景渲染。以下是几种常见方法: 使用Three.js库 Three.js是一个强大的WebGL库,适合创建…

vue实现ssr

vue实现ssr

Vue 实现 SSR(服务端渲染) Vue 的服务端渲染(SSR)允许在服务器端生成完整的 HTML 内容,再发送到客户端,提升首屏加载速度和 SEO 友好性。以下是实现 Vue SSR 的关键步骤和…

vue实现监听

vue实现监听

监听数据变化 在Vue中,可以通过watch选项或$watch方法监听数据的变化。watch适用于组件选项内声明式监听,$watch适用于动态监听。 // 选项式API export defaul…

vue实现addclass

vue实现addclass

Vue 实现动态添加 class 的方法 在 Vue 中动态添加 class 可以通过多种方式实现,以下是常见的几种方法: 使用对象语法 通过绑定一个对象到 :class,可以动态切换 class…