Vue3 响应式之reactive:深入理解 Proxy代理

Vue3系列二:如何实现对响应式数据的代理 本次我们大体介绍了 Vue3 中对响应式数据的代理,其中分为引用类型数据和基本类型数据。我们发现其中的核心设计思路其实并不是很难,但是如果从整个系统来看,要完美无缺的实现对数据的代理,就需要完善的考虑很多因素。Vue3 中对响应式数据的代理与触发就实现的很完善,这也是 Vue3 框架设计的一个重点与难点,也是其魅力所在。 阅读详情

Vue3使用 Proxy 重构了响应式系统,相比 Vue 2 的 Object.defineProperty,它不仅能监听对象属性的增删,还能支持数组和深层嵌套对象。
那么,vue3中的reactive函数,内部使用的 Proxy 是如何实现嵌套对象的响应式代理的呢,下边从实际代码角度进行分析。

1. 最简 Proxy 响应式流程

function reactive(target) {
  return new Proxy(target, {
    get(target, key, receiver) {
      console.log(`GET ${key}`);
      return Reflect.get(target, key, receiver);
    },
    set(target, key, value, receiver) {
      console.log(`SET ${key} = ${value}`);
      return Reflect.set(target, key, value, receiver);
    }
  });
}

const obj = reactive({ name: 'Alice' });
console.log(obj.name) // GET name
obj.name = 'Bob'; // SET name = Bob

上边的代码仅能拦截顶层属性的读写, 无法处理嵌套对象:

const state = reactive({
  user: { name: 'Alice' }
});
state.user.name = 'Bob'; // 不会触发任何set日志

因为 state.user 返回的是原始对象,不是 Proxy

2. 如何让嵌套对象也变成响应式,可能大家想到的是使用vue2中的类似方案对对象进行递归响应式代理:

function defineReactive(obj, key, val) {
  // 递归观测子对象!
  if (typeof val === 'object' && val !== null) {
    observe(val); // 递归调用 observe
  }

  Object.defineProperty(obj, key, {
    get() { /* 依赖收集 */ },
    set(newVal) { /* 触发更新 */ }
  });
}
function deepReactive(obj) {
  for (let key in obj) {
    if (typeof obj[key] === 'object') {
      obj[key] = deepReactive(obj[key]); // 递归代理
    }
  }
  return reactive(obj);
}

缺点:

  • 性能差:大对象初始化慢
  • 内存浪费:未访问的属性也被代理

3. Vue3 的解法:懒递归代理

只在属性被访问时,才将其值转为响应式。

在 get 拦截器中,对返回的对象值再次调用 reactive。

步骤 1:定义 isObject
function isObject(val) {
  return val !== null && typeof val === 'object';
}
步骤 2:使用 WeakMap 缓存已代理对象
避免对同一个对象重复创建 Proxy:
const reactiveMap = new WeakMap();
function createReactiveObject(target, handlers) {
  if (!isObject(target)) return target;
  // 如果已经代理过,直接返回缓存
  if (reactiveMap.has(target)) {
    return reactiveMap.get(target);
  }
  const proxy = new Proxy(target, handlers);
  reactiveMap.set(target, proxy); // 原始对象 → 代理对象
  return proxy;
}
步骤 3:在 get 中递归代理

function createGetter() {
  return function get(target, key, receiver) {
    const res = Reflect.get(target, key, receiver);
    
    // 如果取到的是对象,就把它也变成响应式的
    if (isObject(res)) {
      return reactive(res);
    }
    return res;
  };
}

function createSetter() {
  return function set(target, key, value, receiver) {
    return Reflect.set(target, key, value, receiver);
  };
}

const mutableHandlers = {
  get: createGetter(),
  set: createSetter()
};

function reactive(target) {
  return createReactiveObject(target, mutableHandlers);
}
4. 测试:嵌套对象也能响应!
const state = reactive({
  user: {
    profile: {
      name: 'Alice'
    }
  }
});
console.log(state.user.profile.name); 
// 输出: Alice
// 内部调用链:
//   get user → reactive(user)
//   get profile → reactive(profile)
//   get name → 'Alice'

4. 注意事项

4.1 为什么用 WeakMap?

  • key 必须是对象
  • 不阻止垃圾回收(当原始对象无引用时,缓存自动消失)
  • 完美匹配 “原始对象 到代理对象” 的映射需求

4.2 为什么不一开始就代理所有属性

  • 性能优化:只代理被访问的部分

5. 总结

关键点说明
懒代理只在属性被访问时才代理其值,提升性能
WeakMap 缓存避免同一对象多次代理,防止内存泄漏
isObject 判断必须包含数组等引用类型

Vue3 (Proxy代理解决跨域) vue3中使用proxy代理机制解决跨域问题。 阅读详情

相关推荐

Vue3新手必看:reactive变量响应式丢失的5种解决方案(附代码对比)

本文深入探讨了Vue3中reactive变量响应式丢失的常见问题及其解决方案。文章从响应式原理入手,详细分析了五种应对策略,包括属性级更新、Object.assign、使用ref、嵌套对象设计以及TypeScript实践,并提供了代码对比,旨在帮助开发者理解Vue3响应式核心机制,从而构建更健壮的状态管理。

qsc901234的博客 702

Vue3 中的代理原理详解

### Vue3 中的代理原理详解 Vue3 中引入了代理(Proxy)机制,取代了 Vue2 中的 Object.defineProperty() 机制,用于实现数据响应式。代理机制是 ES6 中新增的特性,它可以用来自定义对象中的操作,比如属性查找、赋值、枚举、函数调用等。在 Vue3 中,代理机制用于拦截对象中的属性访问和修改,从而实现数据的响应式。 #### 什么是代理? 代理(Proxy)是 ES6 中新增的一个特性,它可以用来自定义对象中的操作。代理是一个对象,它可以拦截并重定义基本操作,

five-five 5072

Vue3响应式原理:Proxy与依赖收集机制详解

现代前端框架的核心机制之一是响应式系统,它通过自动追踪数据依赖关系实现视图与状态的同步。其技术原理主要基于ES6 Proxy的元编程能力,相比Vue2的Object.defineProperty方案,Proxy能原生拦截13种对象操作且无需递归遍历属性。在Vue3的实现中,通过WeakMap构建三级依赖映射表(target→key→effects),结合effect副作用函数实现细粒度的依赖收集与触发。这种设计显著提升了大型应用的性能表现,特别适合处理动态数据结构和频繁状态变更的场景。文章通过TypeScr

weixin_34320159的博客 680

vue3项目配置代理

使用 Vue CLI 的 devServer.proxy 配置。使用 http-proxy-middleware 进行配置。此方式和上面的方式类似,但是它是手动添加的而不是通过。

m0_73481765的博客 5406

Vue3 Proxy响应式原理与实现详解

JavaScript的Proxy是ES6引入的元编程特性,能够在对象级别拦截各种操作。在响应式编程中,Proxy取代了Object.defineProperty方案,解决了属性增删检测、数组变异处理等痛点。通过get/set拦截器实现依赖收集和触发更新,配合WeakMap构建的依赖关系图,构成了现代前端框架响应式系统的核心机制。这种设计在Vue3中展现出显著优势:支持Map/Set等数据结构、延迟代理优化性能、完善的类型推导。实际开发中,结合ref处理基本类型、shallowReactive优化大型对象、t

diaohong5075的博客 372

Nsight Compute内存图表实战:如何快速定位CUDA内核的内存瓶颈(附配置截图)

本文详细介绍了如何使用Nsight Compute的Memory Chart功能快速定位和诊断CUDA内核中的内存性能瓶颈。通过解析内存图表中的逻辑与物理单元节点、连线颜色含义,并结合实战案例(如低L1缓存命中率、共享内存Bank冲突、全局内存访问未合并),指导开发者从可视化数据回溯至源代码,进行精准有效的内存访问优化,从而提升GPU程序性能。

zeta9的博客 479

vue3中的配置代理

基于vue3的配置代理解决跨域的相关知识总结与相关案例

qq_45334976的博客 1万+

从充电管理芯片里‘偷师’:拆解一个PMOS双向开关电路,搞定你的固态继电器需求

本文深入解析了PMOS双向开关电路在固态继电器应用中的设计要点,重点探讨了防电流倒灌和高侧双向开关的实现技巧。通过拆解充电管理芯片中的PMOS背靠背结构,工程师可以构建高效可靠的固态开关方案,适用于智能硬件和电池管理系统。文章还提供了关键参数选择、电路优化建议及实测数据对比,助力解决电源防反接等工程难题。

weixin_33698043的博客 482

Vue3 基础知识点整理 —— 从入门到响应式核心完全指南

Vue(读音 /vjuː/,同 view)是一套用于构建用户界面的渐进式 JavaScript 框架。

suger__salt的博客 463

【科技前沿】用深度强化学习优化电网,让电力调度更聪明!

Hey小伙伴们,今天我要跟大家分享一个超级酷炫的技术应用——深度强化学习在电网优化中的典型案例!如果你对机器学习感兴趣,或是正寻找如何用AI技术解决实际问题的方法,这篇分享绝对不容错过!👩‍💻✨

Jacklx888的博客 3246

每日算法讲解(十):使用BP神经网络进行回归任务

BP神经网络是由输入层、隐藏层和输出层组成的多层前馈神经网络,通过反向传播算法(Backpropagation)来调整网络权重和偏置,以最小化预测误差。前向传播:将输入数据通过网络,计算每层的激活值和输出。计算误差:根据预测值和真实值之间的差异计算损失函数值。反向传播:从输出层开始,逐层向后计算梯度,并更新每层的权重和偏置。重复迭代:通过多次迭代,逐步减小预测误差,优化模型参数。接下来,我们定义一个包含一个输入层、两个隐藏层和一个输出层的BP神经网络模型。# 定义模型# 编译模型。

rhtee的博客 1727

【vue-7】Vue3 响应式数据声明:深入理解 reactive()

Vue3的reactive()函数是组合式API的核心响应式工具,用于将普通对象转换为响应式代理。它基于Proxy实现,支持深度响应式,能跟踪对象及其嵌套属性的变化。文章详细介绍了reactive()的特性、使用场景(如复杂状态管理、表单处理)、注意事项(避免解构和重新赋值),以及与ref()的对比。还提供了结合computed和watch的高级用法及最佳实践建议,帮助开发者更高效地使用Vue3的响应式系统。

weixin_39033358的博客 1576

开源数显表

开源数显表,广泛应用于车床、铣床、磨床、镗床、火花机、线切割等。市面上此类液晶数显表多数都是基于此项目。 一、基本配置 硬件 主控:STM32F407VGT6 LCD:群创AT070TN92 显示驱动:RA8875 光栅尺:3 x 输入(X/Y/Z) 串口:1 x MAX3232 继电器:2 x 输出 存储:AT24C64 模拟输入:LM324C 电源:AC 220V 软件 工程版本:Keil 5 STM32库:V1.4.0 图形界面:uCGUI 多语言支持:中文、英文 二、项目文

m0_70934529的博客 435

Vue 3 响应式核心:深入理解 ref 与 reactive 的选择之道

Vue 3 的 Composition API 带来了更灵活的状态管理方式,其中 ref 和 reactive 是创建响应式数据的两个基石。虽然它们的目标一致——让数据变化驱动视图更新,但在使用场景和特性上存在关键差异。本文将深入剖析 ref 和 reactive,帮助你清晰理解它们的原理、区别,并在实际开发中做出明智选择。

2301_81137804的博客 1494

如何完全卸载axure软件以及解决安装axure后打不开的问题【2023年】

如何完全卸载axure软件以及解决安装axure后打不开的问题【2023年】

念兮为美 5139

Allegro 给元器件PCB封装库添加3D模型详细步骤

从上面视图可以看到模型跟PCB 库的方向是对了,但是位置偏下,且在PCB封装库后面,我们下面需要做的就是把模型往上移、往前移。首先将元器件3D模型文件放在封装库的目录下(也可以单独新建一个模型库文件夹),注意3D文件必须是Step格式。Transparent: 选择透视的对象,可以是模型、也可以是PCB封装,或者两种都透视。在左边搜索要添加的3D模型的文件(注意是在* 星号前面输入文件名),按回车即可找到。同样的,接下来需要往Y 负方向移,即左移,一边调整一边观察视图。

sinat_15677011的博客 3682

从零实现 Vue 3 reactive:基于 Proxy 的响应式原理深度解析

响应式编程是现代前端框架的核心范式,它通过数据绑定实现视图的自动更新。其原理基于发布-订阅模式,利用 ES6 的 Proxy 和 Reflect API 拦截对象操作,在属性读取时收集依赖(track),在属性修改时触发更新(trigger)。这种机制为复杂应用状态管理提供了高效、声明式的解决方案,广泛应用于 UI 渲染、状态管理等场景。本文通过模拟实现 Vue 3 的 reactive 函数,深入剖析了依赖收集与触发更新的核心流程,并探讨了如何通过 Proxy 实现深响应、处理数组变异方法等关键技术细节,

weixin_34192816的博客 453

撸毛笔记-朴朴超市 v1.01

朴朴超市 v1.01脚本地址:自动签到和组队赚朴分, 朴分可以抵扣50%的金额组队瓜分需要4人成团, 每个号每天只能开团和入队各一次每天跑一两次即可使用扫码或自己想办法捉refreshToken扫码获取token: (先微信进入朴朴超市小程序并登录注册过账号再扫码)把获取的refreshToken和备注(非必须)填到文件pupuCookie.txt里(第一次运行会自动创建), 多账号换行或&或@隔开。

xiaoshun007的专栏 1810

Vue响应式编程:深入理解reactive的用法与原理

在Vue 3中,开发者可以通过Composition API中的reactive函数来创建响应式对象,这为状态管理提供了更加灵活和强大的方式。当使用reactive包装一个对象时,Vue会递归地遍历对象的所有属性,并为每个嵌套对象创建相应的代理。在这个例子中,不仅obj是响应式的,obj.a、obj.a.b和obj.a.b.c也都是响应式的。reactive是Vue 3响应式系统的核心功能之一,它提供了强大而灵活的对象响应式能力。现在,当car对象的属性发生变化时,任何使用这些属性的视图都会自动更新。

weixin_54447959的博客 909

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

为什么Vue3.0的reactive数据不能直接替换?深入理解响应式原理

本文深入解析了Vue 3中reactive响应式数据不能直接替换为新对象的原因。核心在于reactive返回的是基于Proxy的代理实例,响应性连接绑定于此实例。直接赋值会破坏此连接,导致视图不更新。文章探讨了其原理,并提供了使用Object.assign覆盖属性、利用ref包装对象等安全重置策略。

cc789的博客 772

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Vue3 响应式数据深解:ref 与 reactive 的实现与实战

本文深入解析Vue3响应式系统,对比ref和reactive的实现原理与使用场景。ref通过对象包裹实现基本类型响应式,reactive则基于Proxy深度监测对象变化。在组件开发中,基本类型优先使用ref,对象类型选择reactive,解构时配合toRefs保持响应性。文章还提供了处理数组、DOM引用等实战技巧,并推荐使用浅层API优化大型对象性能。掌握这些核心机制,能更灵活地构建Vue3应用状态管理系统。

jingpide9527的博客 1413

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Vue3响应式原理与Proxy实现详解

响应式编程是现代前端框架的核心机制,它通过自动追踪数据依赖关系实现UI与状态的同步更新。其原理基于ES6 Proxy特性,能够拦截对象操作实现细粒度的依赖收集与更新触发。相比传统的Object.defineProperty方案,Proxy提供了更全面的属性拦截能力,包括动态属性增删和数组变化检测。在Vue3框架中,这种技术显著提升了性能表现,特别是在处理大型对象和复杂数据结构时。通过TypeScript实现的简易响应式库,开发者可以深入理解reactive、ref、effect等核心概念的工作机制,这些知识

364

Vue3 响应式难哭?这份笔记把 ref/reactive 讲得比奶茶还甜

本文介绍了Vue3的基础使用和核心响应式概念。首先讲解基础三剑客:index.html引入main.ts,main.ts创建Vue实例并挂载根组件App.vue。重点解析了响应式系统的ref和reactive:ref通过RefImpl对象实现基础类型响应式,reactive通过Proxy代理对象实现响应式,并详细说明了避免解构和重新赋值导致响应式丢失的方法。还介绍了computed计算属性和watch监听器的使用场景,包括基础类型监听、对象属性监听、ref对象深度监听以及reactive对象监听的不同实现方

小安同学的博客 1683

Vue 3响应式系统:Proxy机制深度解析与应用实践

Proxy是ES6引入的重要特性,它允许开发者拦截并自定义对象的基本操作,为元编程提供了强大支持。在响应式编程领域,Proxy通过拦截get/set操作实现数据变化的自动追踪,这正是现代前端框架响应式系统的核心原理。Vue 3创造性地运用Proxy重构了响应式系统,相比Vue 2的Object.defineProperty方案,Proxy原生支持数组变化检测和动态属性添加,大幅提升了性能表现。在组件开发中,Proxy机制被广泛应用于状态管理、Props处理和模板引用等场景,配合组合式API可以构建更灵活的应

weixin_30635053的博客 321

深入理解Vue 3响应式系统:从Proxy原理到企业级最佳实践

Vue3响应式系统解析:从原理到实践 本文深入探讨Vue3响应式系统的核心机制与应用实践。相比Vue2基于Object.defineProperty的实现,Vue3采用ES6 Proxy重构响应式系统,带来更全面的数据拦截能力和性能优化。文章详细解析了响应式API(reactive/ref/computed/watch)的实现原理,包括Proxy拦截机制、依赖收集与触发更新的完整流程,并提供了企业级应用中的状态组织方案和性能优化策略。通过剖析响应式系统的设计哲学,帮助开发者从"黑盒使用"

2503_91809337的博客 819

巧妙的响应式:深入理解Vue 3的响应式机制

注:本文是大圣老师课程的笔记,原课程地址:07 | 巧妙的响应式:深入理解Vue 3的响应式机制 一,什么是响应式 看下面的代码,double依赖于count,但是当我们修改了count,double却没有发生对应的变化。 let count = 1 let double = count * 2 console.log(double)//2 count = 2 console.log(double)//2 想要实现count变化后,double自动更新。就需要一个东西去实时监听count,当发现count

weixin_42349568的博客 1006
上一篇: TypeScript工具类型之omit
下一篇: Vue3 响应式依赖收集与更新之effect
Zhencode
博客等级 码龄7年 106粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值