From 9755f4383fd774966674e27616ea43105c4f260f Mon Sep 17 00:00:00 2001 From: daiwei Date: Thu, 18 Sep 2025 21:24:32 +0800 Subject: [PATCH 1/2] fix(reactivity): respect readonly during ref unwrapping --- packages/reactivity/src/baseHandlers.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index 63680181927..68ad10f3a1a 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)) { From b5de9cc17f625bff2180c0480f8a3417c4c6074b Mon Sep 17 00:00:00 2001 From: daiwei Date: Thu, 18 Sep 2025 21:33:32 +0800 Subject: [PATCH 2/2] test: add test --- packages/reactivity/__tests__/readonly.spec.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/reactivity/__tests__/readonly.spec.ts b/packages/reactivity/__tests__/readonly.spec.ts index b8dbdc3f6cc..a6f7542ce12 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', () => {