当前位置:首页 > 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 确保已安装Node.js和npm。使用Vue CLI创建新项目: npm install -g @vue/cli vue create project-name cd p…

Vue实现路由监

Vue实现路由监

Vue 实现路由监听的方法 在 Vue 中可以通过多种方式实现路由监听,以下是常见的几种方法: 使用 watch 监听 $route 对象 通过 Vue 的 watch 功能可以监听 $route…

php购物车的实现原理

php购物车的实现原理

购物车基本概念 购物车是电子商务网站的核心功能之一,允许用户临时存储选中的商品,支持增删改查操作,最终生成订单。PHP实现通常结合Session或数据库存储数据。 Session存储实现 使用PHP…

vue watch 实现原理

vue watch 实现原理

Vue Watch 实现原理 Vue 的 watch 功能用于监听数据变化并执行回调函数。其核心原理基于 Vue 的响应式系统,通过依赖收集和触发更新机制实现。 依赖收集 在 Vue 的响应式系统中…

vue keepalive实现原理

vue keepalive实现原理

Vue KeepAlive 实现原理 Vue 的 KeepAlive 组件通过缓存组件实例来避免重复渲染,提升性能。以下是其核心实现原理: 缓存机制 KeepAlive 组件内部维护一个缓存对象 c…

Vue 实现下载

Vue 实现下载

Vue 实现文件下载的方法 前端下载(纯前端生成文件) 适用于需要动态生成文件内容并下载的场景,如导出表格数据为 CSV 或 Excel。 // 创建 Blob 对象并触发下载 const dow…