VUE3实现响应式原理

// 保存当前需要收集的响应式函数
let activeFn = null

/**
 * Depend优化:
 *  1> depend方法
 *  2> 使用Set来保存依赖函数, 而不是数组[]
 */

class Depend {
    constructor() {
        this.reactiveFns = new Set()
    }
    // addDepends(fn) {
    //     this.reactiveFns.push(fn)
    // }
    depend() {
        if (activeFn) {
            this.reactiveFns.add(activeFn)
        }
    }
    notify() {
        this.reactiveFns.forEach(fn => {
            fn()
        })
    }
}

// 封装一个获取depend函数
const targetMap = new WeakMap()
function getDepend(target, key) {
    //根据target对象获取map
    let map = targetMap.get(target)
    if (!map) {
        map = new Map()
        targetMap.set(target, map)
    }

    //根据key获取depend对象
    let depend = map.get(key)
    if (!depend) {
        depend = new Depend()
        map.set(key, depend)
    }
    return depend
}

//构造响应式的函数
function watchFn(fn) {
    activeFn = fn;
    fn()
    activeFn = null
}


function reactive(obj) {
    return new Proxy(obj, {
        get: function (target, key, receiver) {
            // 根据target.key获取对应的depend
            const depend = getDepend(target, key)
            // depend.addDepends(activeFn)
            //添加响应式函数
            depend.depend()
            return Reflect.get(target, key, receiver)
        },
        set: function (target, key, newValue, receiver) {
            Reflect.set(target, key, newValue, receiver)
            const depend = getDepend(target, key)
            depend.notify()
        }
    })
}

const obj = reactive({
    name: "lisa",
    age: 18
})

// watchFn(() => {
//     console.log(obj.name)
// })
watchFn(() => {
    console.log(obj.age)
    console.log('name change',obj.name)
})
obj.name = 'jack'
obj.age = 20


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值