← 返回首页
Vue3基础教程(三十四)
发表时间:2021-08-14 01:29:54
自定义shallowReactive与reactive

1.自己实现shallowReactive


//劫持事件处理句柄
const reactiveHandler = {
    get(target, key) {
        if (key === '_is_reactive') return true
        return Reflect.get(target, key)
    },

    set(target, key, value) {
        const result = Reflect.set(target, key, value)
        console.log('数据已更新, 去更新界面')
        return result
    },

    deleteProperty(target, key) {
        const result = Reflect.deleteProperty(target, key)
        console.log('数据已删除, 去更新界面')
        return result
    },
}

/*
自定义shallowReactive
*/
function shallowReactive(target) {
    if (target && typeof target === 'object') {
        return new Proxy(target, reactiveHandler)
    }
}

/* 测试自定义shallowReactive */
const proxy = shallowReactive({
    a: {
        b: 3
    }
})

//proxy.a = {b: 4} //劫持到了
//console.log(proxy);
proxy.a.b = 5 // 没有劫持到
console.log(proxy);

2.自己实现reactive

//劫持事件处理句柄
const reactiveHandler = {
    get(target, key) {
        if (key === '_is_reactive') return true
        return Reflect.get(target, key)
    },

    set(target, key, value) {
        const result = Reflect.set(target, key, value)
        console.log('数据已更新, 去更新界面')
        return result
    },

    deleteProperty(target, key) {
        const result = Reflect.deleteProperty(target, key)
        console.log('数据已删除, 去更新界面')
        return result
    },
}

/*
自定义reactive
*/
function reactive(target) {
    if (target && typeof target === 'object') {
        if (target instanceof Array) { // 数组,遍历每一个元素深度劫持
            target.forEach((item, index) => {
                target[index] = reactive(item)
            })
        } else { // 对象,遍历每一个属性深度劫持
            Object.keys(target).forEach(key => {
                target[key] = reactive(target[key])
            })
        }
        const proxy = new Proxy(target, reactiveHandler)
        return proxy
    }
    return target
}

/* 测试自定义reactive */

const obj = {
    a: 'abc',
    b: [{x: 1}],
    c: {x: [11]},
}

const proxy = reactive(obj)
console.log(proxy);
proxy.b[0].x += 1
proxy.c.x[0] += 1

console.log(proxy)