讲师中心 微信公众号
AI工具推荐 视频效率加速

Vue 3 中 reactive 在处理 ES6 的 Map 和 Set 数据类型时有哪些注意事项

云萱君_3940

云萱君_3940

发布时间:2026-09-28 06:56:01

|

353人浏览过

|

来源于php中文网

原创

Vue 3 的 reactive 可代理 Map 和 Set,但需显式包裹、用原生方法操作、注意 key/value 类型及引用一致性,WeakMap/WeakSet 不支持响应式。

vue 3 中 reactive 在处理 es6 的 map 和 set 数据类型时有哪些注意事项

Vue 3 的 reactive 能直接代理 Map 和 Set,但不是“包上就万事大吉”,必须配合正确的创建方式、操作习惯和数据结构设计,否则视图不会更新,甚至报错或行为异常。

必须显式用 reactive 包裹,不能裸露赋值

new Map() 或 new Set() 直接赋给 reactive 对象的属性,不会获得响应性。Vue 不会自动递归处理嵌套的集合实例。

  • ✅ 正确:const myMap = reactive(new Map()) 或 const state = reactive({ cache: new Map() }) → 后续调用 myMap.set() 会触发更新
  • ❌ 错误:const state = reactive({ cache: new Map() }); state.cache.set('k', 'v') → cache 是普通 Map 实例,未被代理,不响应
  • ⚠️ 注意:ref 包裹也可行(如 ref(new Map())),但读写需加 .value,且原生方法调用(如 map.value.set())默认不触发依赖收集,需手动 triggerRef

所有变更必须走原生方法,禁止绕过代理

Proxy 拦截只发生在调用集合自身 API 时。任何跳过方法调用的操作,都会脱离响应链。

  • ✅ 有效:myMap.set(key, val)、myMap.delete(key)、mySet.add(item)、mySet.clear()
  • ❌ 失效:myMap[key] = val(Map 不支持方括号赋值,且即使支持也会跳过 Proxy)、mySet[0] = item(Set 无索引)、myMap.size = 0(size 是只读属性,修改无效且不触发响应)
  • ⚠️ 遍历安全:用 v-for="[key, value] of myMap" 或 myMap.forEach() 是响应式的;但 Array.from(myMap)[0] = ... 会生成新数组,脱离响应上下文

Key 和 value 类型影响响应稳定性

Map 的 key 和 Set 的 value 若为对象,其引用一致性直接决定 has()、get()、delete() 是否能正常工作。

React Best Practices 2 0.1.0
React Best Practices 2 0.1.0

React 与 Next.js 性能优化指南,源自 Vercel 工程团队。适用于编写、审查或重构 React/Next.js 代码时使用。

下载

立即学习“前端免费学习笔记(深入)”;

  • ✅ 推荐 key 类型:字符串、数字、Symbol,或**同一个 reactive 对象实例**(如提前定义 const userKey = reactive({ id: 1 }),始终复用)
  • ❌ 避免每次新建对象作 key:myMap.get({ id: 1 }) → 引用不同,查不到,响应失效
  • ✅ Set 中添加响应式对象:mySet.add(reactive({ name: 'Alice' })) → 其属性变化可被 computed 或 effect 捕获
  • ⚠️ 注意:Set 结构本身只响应 add/delete/clear,不因内部对象属性变而重渲染 v-for 列表;若需列表更新,需在修改后显式读取或触发依赖(如再次访问 mySet.values())

内部值不会自动深层响应,需手动处理

reactive() 只代理集合容器本身,不递归将内部值转为响应式。对象值是否响应,取决于插入前是否已用 reactive 或 ref 包裹。

  • ❌ myMap.set('user', { name: 'Alice' }) → 修改 user.name 不触发任何响应
  • ✅ myMap.set('user', reactive({ name: 'Alice' })) → user.name 变化会触发关联的 effect 或 computed,但不会让 v-for 重新执行,除非你再次读取该值(如 myMap.get('user'))
  • ✅ 替代方案:用 ref 包裹每个值,再存入 Map/Set,便于细粒度控制

WeakMap 和 WeakSet 明确不支持响应式

Vue 3 不劫持 WeakMap / WeakSet,因其弱引用机制与 Proxy 的拦截逻辑冲突,无法安全追踪依赖。

  • ❌ reactive(new WeakMap()) 或 ref(new WeakSet()) → 不生效,控制台可能警告或静默失败
  • ✅ 如需弱引用 + 响应式,需自行封装逻辑(例如用 Map 存 key 引用,用 WeakMap 存额外元数据,但响应性仅由 Map 驱动)

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2143

2023.08.11

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

4583

2023.10.09

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

5730

2024.03.19

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

5158

2024.03.22

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

723

2024.05.22

es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

265

2023.07.17

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

386

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

355

2025.12.24

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

160

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 16.8万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.4万人学习

Vue.js 微实战--十天技能课堂
Vue.js 微实战--十天技能课堂

共18课时 | 1.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn