当前位置:首页 > VUE

Vue的实现原理 proxy

2026-02-22 08:10:07VUE

Vue 3 的响应式原理:Proxy

Vue 3 使用 Proxy 替代了 Vue 2 中的 Object.defineProperty 来实现响应式系统。Proxy 是 ES6 提供的一种机制,可以拦截对象的操作,如属性读取、赋值、删除等。

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
    }
  })
}

Proxy 的优势

  • 深层监听Proxy 可以监听对象的所有属性,包括新增和删除的属性,无需像 Object.defineProperty 那样递归遍历。
  • 数组支持Proxy 可以直接监听数组的变化(如 pushpop 等操作),而 Object.defineProperty 需要特殊处理。
  • 性能更好Proxy 只在访问属性时触发,而 Object.defineProperty 需要在初始化时递归遍历所有属性。

依赖收集与触发更新

Vue 3 的响应式系统通过 tracktrigger 实现依赖收集和更新触发:

Vue的实现原理 proxy

  • track:在读取属性时记录当前正在运行的副作用(如组件的渲染函数)。
  • trigger:在属性修改时找到所有依赖该属性的副作用并重新执行。
let activeEffect = null

const track = (target, key) => {
  if (activeEffect) {
    // 将 activeEffect 添加到依赖集合中
  }
}

const trigger = (target, key) => {
  // 找到依赖 target[key] 的所有副作用并执行
}

与 Vue 2 的对比

  • 初始化性能:Vue 2 的 Object.defineProperty 需要在初始化时递归遍历所有属性,而 Vue 3 的 Proxy 是惰性的,仅在访问时处理。
  • 动态属性:Vue 2 无法检测新增或删除的属性,而 Vue 3 可以。
  • 数组监听:Vue 2 需要重写数组方法(如 pushpop),而 Vue 3 直接支持。

局限性

  • 浏览器兼容性Proxy 无法被 polyfill,因此 Vue 3 无法支持 IE11 及以下浏览器。
  • 原始值限制Proxy 只能代理对象,无法直接代理原始值(如字符串、数字),需通过 ref 包装。

总结

Vue 3 的 Proxy 实现了更高效、更灵活的响应式系统,解决了 Vue 2 中的许多限制,但需注意浏览器兼容性问题。

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

相关文章

vue中样式的实现原理

vue中样式的实现原理

Vue 中样式的实现原理 Vue 的样式处理机制基于其核心的响应式系统和虚拟 DOM 技术,通过编译、作用域隔离和动态绑定实现高效的样式管理。 样式作用域隔离 Vue 的单文件组件(SFC)通过 s…

Vue实现postMessage

Vue实现postMessage

Vue 中使用 postMessage 进行跨窗口通信 在 Vue 中使用 postMessage 可以实现跨窗口通信,适用于不同窗口或 iframe 之间的数据传递。以下是实现方法: 发送消息 在…

Vue数据依赖实现

Vue数据依赖实现

Vue数据依赖实现原理 Vue的数据依赖实现基于响应式系统,核心是通过Object.defineProperty或Proxy拦截数据变化,结合发布-订阅模式实现依赖收集和更新触发。 核心机制 依赖收…

Vue中实现路由

Vue中实现路由

Vue 路由的实现方法 在 Vue 中实现路由通常使用 Vue Router 库。以下是具体的实现步骤: 安装 Vue Router 通过 npm 或 yarn 安装 Vue Router: n…

Vue怎么实现rem

Vue怎么实现rem

Vue中实现rem适配的方法 在Vue项目中实现rem适配,可以通过以下步骤完成。rem(root em)是相对于根元素(html)字体大小的单位,常用于移动端适配。 安装postcss-pxtor…

vue实现原理比较

vue实现原理比较

Vue 2 实现原理 Vue 2 的核心实现基于响应式系统和虚拟 DOM。响应式系统通过 Object.defineProperty 对数据进行劫持,当数据变化时触发依赖更新。虚拟 DOM 则通过 d…