From: edison Date: Wed, 24 Sep 2025 09:10:49 +0000 (+0800) Subject: fix(reactivity): respect readonly during ref unwrapping (#13905) X-Git-Tag: v3.5.22~21 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=aba7feda1703e69e5a7c37f784718de0371adadc;p=thirdparty%2Fvuejs%2Fcore.git fix(reactivity): respect readonly during ref unwrapping (#13905) close #13903 --- diff --git a/packages/reactivity/__tests__/readonly.spec.ts b/packages/reactivity/__tests__/readonly.spec.ts index b8dbdc3f6..a6f7542ce 100644 --- a/packages/reactivity/__tests__/readonly.spec.ts +++ b/packages/reactivity/__tests__/readonly.spec.ts @@ -522,6 +522,16 @@ describe('reactivity/readonly', () => { expect(obj.r).toBe(ro) expect(r.value).toBe(ro) }) + + test('should keep nested ref readonly', () => { + const items = ref(['one', 'two', 'three']) + const obj = { + o: readonly({ + items, + }), + } + expect(isReadonly(obj.o.items)).toBe(true) + }) }) test('should be able to trigger with triggerRef', () => { diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index 636801819..68ad10f3a 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -119,7 +119,8 @@ class BaseReactiveHandler implements ProxyHandler { if (isRef(res)) { // ref unwrapping - skip unwrap for Array + integer key. - return targetIsArray && isIntegerKey(key) ? res : res.value + const value = targetIsArray && isIntegerKey(key) ? res : res.value + return isReadonly && isObject(value) ? readonly(value) : value } if (isObject(res)) {