实现vue3源码-shallowReadonly

75 阅读1分钟

shallowReadonly的功能其实就是浅层实现只读约束,做法也很简单

shallowReadonly

结语

shallowReadonly

期望值其实就是实现浅层约束

test('should not make non-reactive properties reactive', () => {
        const prop: any = shallowReadonly({n: { foo: 1}})
        expect(isReadonly(prop)).toBe(true)
        expect(isReadonly(prop.n)).toBe(false)
    })

shallowReadonly实现只需要在get里面实现判断就行了,再利用之前封装的createGetter

reactive.ts

export function shallowReadonly(raw) {
    return createActiveObject(raw, shallowReadonlyBaseHandlers) 
    // 用之前实现好的封装,在baseHandlers里写下shallowReadonlyBaseHandlers就行了
}

baseHandlers.ts

function createGetter(isReadonly = false, isShallowReadonly = false) {
    return function get(target, key) {
        const res = Reflect.get(target, key)

        // 判断是不是 reactive
        if (key === ReactiveFlags.IS_REACTIVE) {
            return !isReadonly
        } else if (key === ReactiveFlags.IS_READONLY) {
            return isReadonly
        }

        // 判断是不是shallowReadonly
        if (isShallowReadonly) return res

        // 判断是不是 对象
        if (isObject(res)) return isReadonly ? readonly(res) : reactive(res)

        // 依赖收集
        // 抽离公共,判断是否需要收集依赖<readonly>
        !isReadonly && track(target, key)
        return res
    }
}

// 用之前封装好的extend做一下处理
                           // export const extend = Object.assign
export const shallowReadonlyBaseHandlers = extend({}, readonlyBaseHandlers, {
    get: shallowReadonlyGet
})