SOURCE

function reactive(target) {

    const handler = {
        get(target, key, receiver) {
            // 收集依赖
            track(target, key)
            return Reflect.get(target, key, receiver)
        },
        set(target, key, value, receiver) {
            const oldValue = Reflect.get(target, key, receiver)
            let result = true
            if (oldValue != value) {
                result = Reflect.set(target, key, value, receiver)
                // 触发更新
                trigger(target, key)
            }
            return result
        },
        deleteProperty(target, key, receiver) {
            trigger(target, key)
            // 触发更新
            return Reflect.deleteProperty(target, key, receiver)
        }
    }

    return new Proxy(target, handler)

}

let activeCallBack = null
function effect(callback) {
    activeCallBack = callback
    callback && callback()
    activeCallBack = null
}
const trackMaps = new WeakMap()
function track(target, key) {
    if (!trackMaps.get(target)) {
        let depsMap = new Map()
        trackMaps.set(target, depsMap)
    }
    depsMap = trackMaps.get(target)
    if (!depsMap.get(key)) {
        let dep = new Set()
        depsMap.set(key, dep)
    }
    dep = depsMap.get(key)
    dep.add(activeCallBack)
}

function trigger(target, key) {
    let depsMap = trackMaps.get(target)
    let dep = depsMap.get(key)
    dep.forEach(d => {
        d && d()
    })
}


let p = {
    price: 100,
    num: 3
}
const pp = new reactive(p)
let total = 0
effect(() => {
    console.log("触发更新")
    total = pp.price * pp.num
})
console.log(total)
pp.price = 200
console.log(total)
pp.num = 1
console.log(total)

console.log("====================")

function ref(raw){
    if(raw._is_ref_){
        return raw
    }
    let value = raw
    const r = {
        _is_ref_:true,
        get value(){
            track(r,"val")
            return value
        },
        set value(newVal){
            value = newVal
            raw.value = newVal
            trigger(r,"val")
        }
    }
    return r
}

let price = ref(100)
let num = ref(1)
let  total1 = 0
effect(() => {
    console.log("触发更新")
    total1 = price.value * num.value
})
console.log(total1)
price.value = 200
console.log(total1)
num.value = 2
console.log(total1)
console 命令行工具 X clear

                    
>
console