我对vue3的理解

我对 reactive源码的理解

reactive 只能够代理对象
首先它判断传递过来的值是否是对象,如果是才会进行代理。变成响应式的。
Proxy 并没有重写对象的属性,只做代理,在取值的时候回调用get,设置值的时候回调用set方法
在get的时候使用了 Reflect.get(target,key)方法
在set的时候使用了  Reflect.set(target,key,value)方法
为什么要这样做?因为这样可以保证this的指向是代理对象
let target = {
    name: 'zhangsan',
    get say() { 
        console.log('返回的值',this.name)
        return this.name
    }
}
const proxy=  new Proxy(target, {
    get(target, key) { 
        console.log('取值这里也会被触发')
        return Reflect.get(target,key)
    },
    set(target,key,value) { 
        return Reflect.set(target, key,value)
    }
})
console.log(proxy )

weakMap解决同一个对象被代理多次浪费性能

let state={
    name:'xxx',
    age:123
}
let state1=reactive(state)
let state2=reactive(state)
console.log( state1===state2 ) true
如果同一个对象被代理多次会浪费性能。
怎么处理这个问题呢?
利用缓存,使用了 weakMap
为什么要使用了weakMap 呢?
weakMap是弱引用,不会造成内存泄漏
weakMap 和 map很像,但是weakMap的key只能够是对象
这样就实现了 同于一个对象被多次代理,返回同一个代理

代理的对象再次被代理

let state={
    name:'xxx',
    age:123
}
let state1=reactive(state)
let state2=reactive(state1)
怎么解决这个问题了

代理对象被再次代理,可以直接返回,不需要代理了。
它最初是用了 IS_REACTIVE这个字段
会检测代理对象是否有这个字段,如果有,说明这个对象被代理了。
不再需要代理了,直接返回就可以了

vue3 性能方便的提升

1.ref API 的读效率提升 260%,写效率提升约为 50% 。
2.依赖收集的效率提升 40%
3.内存占用减少 17% 。

你对Proxy的理解

Proxy 对象用于创建一个对象的代理,
从而实现拦截和自定义(如属性查找、赋值、枚举、函数调用等)
Proxy并不是深层代理,proxy只会代理第一层。
Vue3中reactive的实现,其实是递归的将对象全部都代理了一遍。

Proxy解决了什么问题

Object.defineProperty无法直接监听对象新增或删除的属性。Proxy可以。
Object.defineProperty我们无法让Map、Set这类数据类型转变为响应式,Proxy可以。
posted @ 2022-08-11 11:10  南风晚来晚相识  阅读(126)  评论(0编辑  收藏  举报