From 72ec68824a7addc66f2c506c1a510b768a2f8687 Mon Sep 17 00:00:00 2001 From: Wick Date: Mon, 15 Apr 2024 22:55:37 +0800 Subject: [PATCH] fix(reactivity): computed should not be detected as true by isProxy (#10401) --- .../reactivity/__tests__/reactive.spec.ts | 31 ++++++++++++++++++- packages/reactivity/src/reactive.ts | 4 +-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/packages/reactivity/__tests__/reactive.spec.ts b/packages/reactivity/__tests__/reactive.spec.ts index cdcd0325805..bd4ec402bb2 100644 --- a/packages/reactivity/__tests__/reactive.spec.ts +++ b/packages/reactivity/__tests__/reactive.spec.ts @@ -1,5 +1,14 @@ import { isRef, ref } from '../src/ref' -import { isReactive, markRaw, reactive, toRaw } from '../src/reactive' +import { + isProxy, + isReactive, + markRaw, + reactive, + readonly, + shallowReactive, + shallowReadonly, + toRaw, +} from '../src/reactive' import { computed } from '../src/computed' import { effect } from '../src/effect' @@ -330,4 +339,24 @@ describe('reactivity/reactive', () => { delete obj[key] expect(dummy).toBe(false) }) + + test('isProxy', () => { + const foo = {} + expect(isProxy(foo)).toBe(false) + + const fooRe = reactive(foo) + expect(isProxy(fooRe)).toBe(true) + + const fooSRe = shallowReactive(foo) + expect(isProxy(fooSRe)).toBe(true) + + const barRl = readonly(foo) + expect(isProxy(barRl)).toBe(true) + + const barSRl = shallowReadonly(foo) + expect(isProxy(barSRl)).toBe(true) + + const c = computed(() => {}) + expect(isProxy(c)).toBe(false) + }) }) diff --git a/packages/reactivity/src/reactive.ts b/packages/reactivity/src/reactive.ts index 7e80737fbcc..f6fcbbdb98f 100644 --- a/packages/reactivity/src/reactive.ts +++ b/packages/reactivity/src/reactive.ts @@ -329,8 +329,8 @@ export function isShallow(value: unknown): boolean { * @param value - The value to check. * @see {@link https://vuejs.org/api/reactivity-utilities.html#isproxy} */ -export function isProxy(value: unknown): boolean { - return isReactive(value) || isReadonly(value) +export function isProxy(value: any): boolean { + return value ? !!value[ReactiveFlags.RAW] : false } /**