10-mini-vue shallowReadonly
·
实现 shallowReadonly 功能
- shallowReadonly 仅将对象最外面这一层设置为 readonly 类型,里面的不动
- 测试代码
it('shallow readonly',()=>{
const props = shallowReadonly({ n: { foo: 1}})
expect(isReadonly(props)).toBe(true)
expect(isReadonly(props.n)).toBe(false)
})
- 实现代码
// 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
}
- 说明
- 在 createGetter 方法中新增一个 shallow 参数,用来表示是否是浅层处理
- 如果是浅层处理,则直接返回 res,不进行后续的 reactive 或 readonly 处理
- 创建 shallowReadonlyGet,传入 true,true 参数
更多推荐
所有评论(0)