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

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 3 组合式 API 与
热门下载
相关下载
精品课程
相关推荐
/
热门推荐
/
最新课程
最新文章
