实现 shallowReadonly 功能

  1. shallowReadonly 仅将对象最外面这一层设置为 readonly 类型,里面的不动
  2. 测试代码
it('shallow readonly',()=>{
  const props = shallowReadonly({ n: { foo: 1}})
  expect(isReadonly(props)).toBe(true)
  expect(isReadonly(props.n)).toBe(false)
})
  1. 实现代码
// reactive.ts
export function shallowReadonly (raw)  {
  return createActiveObject(raw, shallowReadonlyHandlers)
}
// baseHandlers.ts
function createGetter(isReadonly = false, shallow = false) {  // ✅
  return function (target, key) {
    if(key===ReactiveFlags.IS_REACTIVE) { // 是否是响应式数据
      return !isReadonly
    } else if(key === ReactiveFlags.IS_READONLY) { // 是否是只读数据
      return isReadonly
    }
    const res = Reflect.get(target, key)
    if(shallow) {  // ✅
      return res
    }
    // 看看res 是不是 object,如果是的化 调用 reactive 或 readonly 方法再次进行处理
    if(isObject(res)) {
      return isReadonly ? readonly(res) : reactive(res)
    }
    if(!isReadonly) {
      track(target, key)
    }
    return res
  }
}
const shallowReadonlyGet = createGetter(true,true)  // ✅
export const shallowReadonlyHandlers = {  // ✅
  get: shallowReadonlyGet, 
  set
}
  1. 说明
  • 在 createGetter 方法中新增一个 shallow 参数,用来表示是否是浅层处理
  • 如果是浅层处理,则直接返回 res,不进行后续的 reactive 或 readonly 处理
  • 创建 shallowReadonlyGet,传入 true,true 参数
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐