实现浅层代理
约 302 字大约 1 分钟
2026-03-21
处理
shallow参数关键点
通过
createGetter的第二个参数shallow来判断是否是浅层代理代码
baseHandlers.ts// 继续组合基础拦截器 const shallowGet = /*#__PURE__*/ createGetter(false, true); const shallowSet = /*#__PURE__*/ createSetter(true); const shallowReadonlyGet = /*#__PURE__*/ createGetter(true, true); function createGetter(isReadonly = false, shallow = false) { // ... // 在递归处理深层属性之前,先判断是否是浅层代理,如果是则直接返回结果 if (shallow) { return result; } if (isObject(result)) { return isReadonly ? readonly(result) : reactive(result); } return result; }组合
shallowReactiveHandlers关键点
浅层代理与深层代理唯一不同的区别就是在
get阶段是否继续递归包装对象,因此可以通过Object.assign的方式来复用已有 handlers 再按需覆盖代码
baseHandlers.tsexport const shallowReactiveHandlers: ProxyHandler<object> = extend({}, readonlyHandlers, { get: shallowGet, set: shallowSet, });utils.tsexport const extend = Object.assign;shallowReactive函数在 handlers 准备好以后,对外就可以像
reactive一样再包一层 API。最终将其暴露给外部进行使用代码
reactive.tsexport function shallowReactive<T extends object>(target: T): T; export function shallowReactive<T>(target: T): T; export function shallowReactive(target: unknown) { return createReactiveObject(target as Target, false, shallowReactiveHandlers); }
