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', () => { 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)) {