Appearance
多次代理同一个对象的问题
本节目标:理解“多次代理同一个对象的问题”的核心思路,并能把它用于实际开发或面试表达。
const data = { name: 'zf' }
const state1 = reactive(data)
const state2 = reactive(data)目前的代码中, state1是不等于state2的,而我们则是希望, 同一个对象进行多次代理时,我们只代理一次,对第一次代理的结果进行缓存;
WeakMap的键名所指向的对象,不计入垃圾回收机制。也就是说weakmap键名对对象的引用是弱引用,不计入垃圾回收机制;如果键值所引用对象的其它引用都清空了,键名所引用的对象所占用的内存会自动释放,不用考虑键名对其的引用; 了解 weakMap
import { isObject } from "@vue/shared";
// 1、将数据转化为响应式数据,只能做对象的代理
==const== ==reactiveMap== ===== ==new== ==WeakMap====();==
export function reactivity(target) {
if (!isObject) {
return
}
==//== ==有缓存取缓存==
==let== ==existingProxy== ===== ==reactiveMap====.====get====(====target====);==
==if== ==(====existingProxy====)== =={==
==return== ==existingProxy====;==
==};==
const proxy = new Proxy(target, {
get(target, key, receiver) {
return Reflect.get(target, key, receiver)
},
set(target, key, value, receiver) {
return Reflect.set(target, key, value, receiver)
}
})
==//== ==创建缓存==
==reactiveMap====.====set====(====target====,== ==proxy====);==
return proxy
}