From 19ae372739beabbd818abf3384cbea2755514086 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Mon, 7 Jul 2025 08:05:18 +0800 Subject: [PATCH] fix(reactivity): avoid unwrapping `.value` when the proxy is a direct wrapper of Ref (#13569) --- packages/reactivity/__tests__/readonly.spec.ts | 2 +- packages/reactivity/src/baseHandlers.ts | 7 ++++++- packages/reactivity/src/dep.ts | 6 ------ 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/reactivity/__tests__/readonly.spec.ts b/packages/reactivity/__tests__/readonly.spec.ts index 5c70b6082f..b035779f85 100644 --- a/packages/reactivity/__tests__/readonly.spec.ts +++ b/packages/reactivity/__tests__/readonly.spec.ts @@ -523,7 +523,7 @@ describe('reactivity/readonly', () => { }) }) -test.todo('should be able to trigger with triggerRef', () => { +test('should be able to trigger with triggerRef', () => { const r = shallowRef({ a: 1 }) const ror = readonly(r) let dummy diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index faec3012f4..3b2dcfdec9 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -96,15 +96,20 @@ class BaseReactiveHandler implements ProxyHandler { } } + const wasRef = isRef(target) const res = Reflect.get( target, key, // if this is a proxy wrapping a ref, return methods using the raw ref // as receiver so that we don't have to call `toRaw` on the ref in all // its class methods - isRef(target) ? target : receiver, + wasRef ? target : receiver, ) + if (wasRef && key !== 'value') { + return res + } + if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { return res } diff --git a/packages/reactivity/src/dep.ts b/packages/reactivity/src/dep.ts index 3fd81514b6..184964c17b 100644 --- a/packages/reactivity/src/dep.ts +++ b/packages/reactivity/src/dep.ts @@ -15,12 +15,6 @@ class Dep implements Dependency { _subs: Link | undefined = undefined subsTail: Link | undefined = undefined - /** - * @internal - */ - readonly __v_skip = true - // TODO isolatedDeclarations ReactiveFlags.SKIP - constructor( private map: KeyToDepMap, private key: unknown, -- 2.47.2