From aba7feda1703e69e5a7c37f784718de0371adadc Mon Sep 17 00:00:00 2001 From: edison Date: Wed, 24 Sep 2025 17:10:49 +0800 Subject: [PATCH] fix(reactivity): respect readonly during ref unwrapping (#13905) close #13903 --- packages/reactivity/__tests__/readonly.spec.ts | 10 ++++++++++ packages/reactivity/src/baseHandlers.ts | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/reactivity/__tests__/readonly.spec.ts b/packages/reactivity/__tests__/readonly.spec.ts index b8dbdc3f6c..a6f7542ce1 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 6368018192..68ad10f3a1 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)) { -- 2.47.3