Vue3学习(八)-手动实现shallowReactive和reactive

335 阅读1分钟

今天来手动实现shallowReactive(Vue3学习(六))和reactive(Vue3学习(二)),可以点击链接回忆一下具体内容。

手动实现shallowReactive

shallowReactive是浅响应,第一层数据,具体用法可以点击(Vue3学习(六))查看。

手动实现

function shallowReactive(target) {
    return new Proxy(target, {
        get(target, prop) {
            console.log("劫持get()", prop)
            return Reflect.get(target, prop)
        },
        set(target, prop, val) {
            console.log("劫持set()", prop, val)
            return Reflect.set(target, prop, val)
        },
        deleteProperty(target, prop) {
            console.log("劫持delete", prop)
            return Reflect.deleteProperty(target, prop)
        }
    })
}
const targetVal = shallowReactive({
    a: 1,
    b: 2,
    c: {
        d: 3
    }
})

可以在浏览器控制台试一下,结果如下图: image.png

手动实现reactive

reactive是深度响应,具体用法可以点击(Vue3学习(二))查看。

手动实现

function reactive(target) {
    if (target && typeof target ==='object') {
        Object.entries(target).forEach(([key,value])=> {
            if (typeof value === 'object') {
                target[key] = reactive(value)
            }
        })
        return new Proxy(target, {
            get(target, prop) {
                console.log("劫持get()", prop)
                return Reflect.get(target, prop)
            },
            set(target, prop, val) {
                console.log("劫持set()", prop, val)
                return Reflect.set(target, prop, val)
            },
            deleteProperty(target, prop) {
                console.log("劫持delete", prop)
                return Reflect.deleteProperty(target, prop)
            }
        })
    }
}
const targetVal = reactive({
    a: 1,
    b: 2,
    c: {
        d: 3
    }
})

可以在浏览器控制台试一下,结果如下图: image.png

image.png

下期预告手动实现shallowRef和ref,敬请期待。