Vue.js响应式系统对于Map与Set集合类型的劫持实现细节

秋浩姑娘_9199

秋浩姑娘_9199

2026-04-04

1011人浏览

原创

vue 3.x 原生支持 map/set 响应式,通过 reactivemap/reactiveset 子类重写原型方法并结合 proxy 拦截实现依赖追踪与更新通知,而非直接 proxy 包裹实例。

vue.js响应式系统对于map与set集合类型的劫持实现细节

Vue.js 的响应式系统在 3.x 版本中(即 Vue Composition API + reactive())已原生支持 Map 和 Set 的响应式劫持,但实现方式与普通对象不同——它不依赖 Object.defineProperty 或 Proxy 对属性的直接拦截,而是通过包装器(wrapper)模式重写其原型方法,并结合 Proxy 拦截关键操作。

Map 的响应式劫持机制

Vue 不会直接对原始 Map 实例做 Proxy 包裹(因为 Map 的键值对操作不走属性访问,无法用 get/set 捕获),而是:

  • 创建一个继承自原生 Map 的子类(如 ReactiveMap),覆盖所有可能修改数据的方法:`set`, `delete`, `clear`;
  • 对每个被调用的变更方法,在执行前触发依赖收集(track),执行后触发更新通知(trigger),例如:map.set(key, value) 会同时触发对 "keys"、"values"、"size" 和 key 对应项的依赖更新;
  • 读取操作(如 get, has, keys(), values(), entries())也会进行依赖追踪,确保后续变更能精确通知相关副作用;
  • 内部使用 WeakMap 缓存响应式 Map 实例与其依赖关系,避免内存泄漏。

Set 的响应式劫持机制

Set 的处理逻辑与 Map 高度一致:

vue-composition-api-best-practices
vue-composition-api-best-practices

Vue 3 组合式 API 与

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app快速上手
uni-app快速上手

共0课时 | 0人学习

Vue 教程
Vue 教程

共42课时 | 17.2万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 2.5万人学习