From f9f9983d7b9a792a03246965033c5ad21938dd48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=B6=E8=BF=9C=E6=96=B9?= Date: Mon, 5 Jun 2023 18:29:40 +0800 Subject: [PATCH 1/3] fix(reactivity): fix shallowReactive map "unwraps" the nested refs --- .../__tests__/collections/WeakMap.spec.ts | 4 ++-- .../__tests__/collections/WeakSet.spec.ts | 2 +- packages/reactivity/src/collectionHandlers.ts | 16 +++++++++++++--- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/reactivity/__tests__/collections/WeakMap.spec.ts b/packages/reactivity/__tests__/collections/WeakMap.spec.ts index d7657a9f94c..7f2236bb1ea 100644 --- a/packages/reactivity/__tests__/collections/WeakMap.spec.ts +++ b/packages/reactivity/__tests__/collections/WeakMap.spec.ts @@ -98,8 +98,8 @@ describe('reactivity/collections', () => { const key = {} const value = reactive({}) observed.set(key, value) - expect(map.get(key)).not.toBe(value) - expect(map.get(key)).toBe(toRaw(value)) + expect(map.get(key)).toBe(value) + expect(toRaw(map.get(key))).toBe(toRaw(value)) }) it('should return observable versions of contained values', () => { diff --git a/packages/reactivity/__tests__/collections/WeakSet.spec.ts b/packages/reactivity/__tests__/collections/WeakSet.spec.ts index 9ec30019756..30f866a5b1d 100644 --- a/packages/reactivity/__tests__/collections/WeakSet.spec.ts +++ b/packages/reactivity/__tests__/collections/WeakSet.spec.ts @@ -97,7 +97,7 @@ describe('reactivity/collections', () => { const value = reactive({}) observed.add(value) expect(observed.has(value)).toBe(true) - expect(set.has(value)).toBe(false) + expect(set.has(value)).toBe(true) }) it('should return proxy from WeakSet.add call', () => { diff --git a/packages/reactivity/src/collectionHandlers.ts b/packages/reactivity/src/collectionHandlers.ts index 381bbad6c28..b2c12de2d87 100644 --- a/packages/reactivity/src/collectionHandlers.ts +++ b/packages/reactivity/src/collectionHandlers.ts @@ -1,4 +1,10 @@ -import { toRaw, ReactiveFlags, toReactive, toReadonly } from './reactive' +import { + toRaw, + ReactiveFlags, + toReactive, + toReadonly, + isProxy +} from './reactive' import { track, trigger, ITERATE_KEY, MAP_KEY_ITERATE_KEY } from './effect' import { TrackOpTypes, TriggerOpTypes } from './operations' import { capitalize, hasOwn, hasChanged, toRawType, isMap } from '@vue/shared' @@ -67,7 +73,9 @@ function size(target: IterableCollections, isReadonly = false) { } function add(this: SetTypes, value: unknown) { - value = toRaw(value) + if (!isProxy(value)) { + value = toRaw(value) + } const target = toRaw(this) const proto = getProto(target) const hadKey = proto.has.call(target, value) @@ -79,7 +87,9 @@ function add(this: SetTypes, value: unknown) { } function set(this: MapTypes, key: unknown, value: unknown) { - value = toRaw(value) + if (!isProxy(value)) { + value = toRaw(value) + } const target = toRaw(this) const { has, get } = getProto(target) From a9bd541916f88a86aa51a02505388411873975d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=B6=E8=BF=9C=E6=96=B9?= Date: Mon, 5 Jun 2023 18:35:50 +0800 Subject: [PATCH 2/3] test(reactivity): update unit test --- packages/reactivity/__tests__/collections/Map.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reactivity/__tests__/collections/Map.spec.ts b/packages/reactivity/__tests__/collections/Map.spec.ts index 0cbe10fc201..e5969772b66 100644 --- a/packages/reactivity/__tests__/collections/Map.spec.ts +++ b/packages/reactivity/__tests__/collections/Map.spec.ts @@ -258,8 +258,8 @@ describe('reactivity/collections', () => { const observed = reactive(map) const value = reactive({}) observed.set('key', value) - expect(map.get('key')).not.toBe(value) - expect(map.get('key')).toBe(toRaw(value)) + expect(map.get('key')).toBe(value) + expect(toRaw(map.get('key'))).toBe(toRaw(value)) }) it('should return observable versions of contained values', () => { From 6a800132dc826f04a50de4cf98e5a7b99ac624b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=B6=E8=BF=9C=E6=96=B9?= Date: Mon, 5 Jun 2023 18:44:21 +0800 Subject: [PATCH 3/3] test(reactivity): update unit test --- packages/reactivity/__tests__/collections/Set.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reactivity/__tests__/collections/Set.spec.ts b/packages/reactivity/__tests__/collections/Set.spec.ts index ae74eb476ac..84a0fc342a3 100644 --- a/packages/reactivity/__tests__/collections/Set.spec.ts +++ b/packages/reactivity/__tests__/collections/Set.spec.ts @@ -304,7 +304,7 @@ describe('reactivity/collections', () => { const value = reactive({}) observed.add(value) expect(observed.has(value)).toBe(true) - expect(set.has(value)).toBe(false) + expect(set.has(value)).toBe(true) }) it('should observe nested values in iterations (forEach)', () => {