From: Johnson Chu Date: Mon, 7 Jul 2025 00:05:18 +0000 (+0800) Subject: fix(reactivity): avoid unwrapping `.value` when the proxy is a direct wrapper of... X-Git-Tag: v3.6.0-alpha.1~19 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=19ae372739beabbd818abf3384cbea2755514086;p=thirdparty%2Fvuejs%2Fcore.git fix(reactivity): avoid unwrapping `.value` when the proxy is a direct wrapper of Ref (#13569) --- 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,