fix(reactivity): ensure that shallow and normal proxies are tracked seperately (close #2843) (#2851)

fix #2843
This commit is contained in:
Thorsten Lünborg
2021-03-26 20:39:56 +01:00
committed by GitHub
parent 68de9f408a
commit 22cc4a7659
4 changed files with 47 additions and 10 deletions

View File

@@ -5,7 +5,9 @@ import {
ReactiveFlags,
Target,
readonlyMap,
reactiveMap
reactiveMap,
shallowReactiveMap,
shallowReadonlyMap
} from './reactive'
import { TrackOpTypes, TriggerOpTypes } from './operations'
import {
@@ -80,7 +82,15 @@ function createGetter(isReadonly = false, shallow = false) {
return isReadonly
} else if (
key === ReactiveFlags.RAW &&
receiver === (isReadonly ? readonlyMap : reactiveMap).get(target)
receiver ===
(isReadonly
? shallow
? shallowReadonlyMap
: readonlyMap
: shallow
? shallowReactiveMap
: reactiveMap
).get(target)
) {
return target
}

View File

@@ -28,7 +28,9 @@ export interface Target {
}
export const reactiveMap = new WeakMap<Target, any>()
export const shallowReactiveMap = new WeakMap<Target, any>()
export const readonlyMap = new WeakMap<Target, any>()
export const shallowReadonlyMap = new WeakMap<Target, any>()
const enum TargetType {
INVALID = 0,
@@ -92,7 +94,8 @@ export function reactive(target: object) {
target,
false,
mutableHandlers,
mutableCollectionHandlers
mutableCollectionHandlers,
reactiveMap
)
}
@@ -106,7 +109,8 @@ export function shallowReactive<T extends object>(target: T): T {
target,
false,
shallowReactiveHandlers,
shallowCollectionHandlers
shallowCollectionHandlers,
shallowReactiveMap
)
}
@@ -143,7 +147,8 @@ export function readonly<T extends object>(
target,
true,
readonlyHandlers,
readonlyCollectionHandlers
readonlyCollectionHandlers,
readonlyMap
)
}
@@ -160,7 +165,8 @@ export function shallowReadonly<T extends object>(
target,
true,
shallowReadonlyHandlers,
shallowReadonlyCollectionHandlers
shallowReadonlyCollectionHandlers,
shallowReadonlyMap
)
}
@@ -168,7 +174,8 @@ function createReactiveObject(
target: Target,
isReadonly: boolean,
baseHandlers: ProxyHandler<any>,
collectionHandlers: ProxyHandler<any>
collectionHandlers: ProxyHandler<any>,
proxyMap: WeakMap<Target, any>
) {
if (!isObject(target)) {
if (__DEV__) {
@@ -185,7 +192,6 @@ function createReactiveObject(
return target
}
// target already has corresponding Proxy
const proxyMap = isReadonly ? readonlyMap : reactiveMap
const existingProxy = proxyMap.get(target)
if (existingProxy) {
return existingProxy