From 656135b13dbc6053a133250b9321ab9b39238a99 Mon Sep 17 00:00:00 2001 From: OnlyWick Date: Tue, 27 Feb 2024 18:53:02 +0800 Subject: [PATCH] refactor(reactivity): priority check if the object is invalid --- packages/reactivity/__tests__/reactive.spec.ts | 15 +++++++++++++++ packages/reactivity/src/reactive.ts | 16 ++++------------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/packages/reactivity/__tests__/reactive.spec.ts b/packages/reactivity/__tests__/reactive.spec.ts index ab953ff891a..98dea5c06a7 100644 --- a/packages/reactivity/__tests__/reactive.spec.ts +++ b/packages/reactivity/__tests__/reactive.spec.ts @@ -302,4 +302,19 @@ describe('reactivity/reactive', () => { const observed = reactive(original) expect(isReactive(observed)).toBe(false) }) + + test('should not check cache', () => { + const foo = {} + Object.freeze(foo) + const noObserved = reactive(foo) + expect(noObserved).toBe(foo) + + const bar = {} + // put in cache + reactive(bar) + Object.freeze(bar) + // do not check cache + const observed = reactive(bar) + expect(observed).toBe(bar) + }) }) diff --git a/packages/reactivity/src/reactive.ts b/packages/reactivity/src/reactive.ts index 1e0f9365daa..0bb406dece2 100644 --- a/packages/reactivity/src/reactive.ts +++ b/packages/reactivity/src/reactive.ts @@ -252,24 +252,16 @@ function createReactiveObject( } return target } - // target is already a Proxy, return it. - // exception: calling readonly() on a reactive object - if ( - target[ReactiveFlags.RAW] && - !(isReadonly && target[ReactiveFlags.IS_REACTIVE]) - ) { + const targetType = getTargetType(target) + const isBaseOnReactiveTarget = isReadonly && target[ReactiveFlags.IS_REACTIVE] + const isInvalid = targetType === TargetType.INVALID + if ((target[ReactiveFlags.RAW] && !isBaseOnReactiveTarget) || isInvalid) { return target } - // target already has corresponding Proxy const existingProxy = proxyMap.get(target) if (existingProxy) { return existingProxy } - // only specific value types can be observed. - const targetType = getTargetType(target) - if (targetType === TargetType.INVALID) { - return target - } const proxy = new Proxy( target, targetType === TargetType.COLLECTION ? collectionHandlers : baseHandlers,