Proxy状态管理库通过get/set陷阱拦截读写、按属性粒度收集依赖并精准触发更新,提供createStore和subscribe API,支持细粒度响应与可选快照机制。

用 Proxy 实现轻量级状态管理库,核心在于拦截数据读写、自动收集依赖、精准触发更新——不靠框架、不写模板、也不引入冗余抽象。
用 Proxy 拦截状态访问与修改
Proxy 的 get 和 set 陷阱是基础支撑:
- get 中记录当前正在执行的副作用函数(比如组件渲染函数),实现“谁读了我,就订阅我”
- set 中比对新旧值,仅在真正变更时通知对应属性的订阅者,避免无效更新
- 对嵌套对象或数组,需递归代理(或用 WeakMap 缓存已代理对象),确保深层属性也能被追踪
实现依赖收集与响应通知
不能让所有订阅者监听整个状态对象,否则改一个字段就全量重渲染。应该按属性粒度组织监听关系:
- 用 Map<string, Set<Function>> 存储每个属性名对应的回调集合
- 在 get 时,若当前存在活跃的副作用函数(通过闭包或全局栈维护),就把它加入该属性的监听集
- 在 set 时,只遍历该属性名下的回调并执行,不打扰其他字段
提供简洁易用的 API 接口
开发者不需要理解 Proxy 细节,只需会创建、订阅、更新:
- createStore(initialState):返回 { state, subscribe },state 是代理对象,subscribe 接收回调并返回取消函数
- subscribe(key, callback):只监听某个字段,支持细粒度更新
- 允许直接赋值(
state.count = 5)而非 dispatch action,符合直觉
支持快照与不可变语义(可选增强)
为避免组件中意外修改原始状态,可结合 useSnapshot 类机制:
- 每次读取时生成结构共享的只读快照,既保证响应式,又防止误改
- 快照内部仍指向代理状态,因此后续更新能立刻反映到已渲染组件中
- 不强制深克隆,兼顾性能与安全性


















