From: Tycho Date: Wed, 20 Aug 2025 12:45:01 +0000 (+0800) Subject: fix(reactivity): warn on nested readonly ref update during unwrapping (#12141) X-Git-Tag: v3.5.19~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1498821ed9eeb22a0767e53ddc1f6a2840598a29;p=thirdparty%2Fvuejs%2Fcore.git fix(reactivity): warn on nested readonly ref update during unwrapping (#12141) --- diff --git a/packages/reactivity/__tests__/readonly.spec.ts b/packages/reactivity/__tests__/readonly.spec.ts index b035779f85..b8dbdc3f6c 100644 --- a/packages/reactivity/__tests__/readonly.spec.ts +++ b/packages/reactivity/__tests__/readonly.spec.ts @@ -498,9 +498,10 @@ describe('reactivity/readonly', () => { const r = ref(false) const ror = readonly(r) const obj = reactive({ ror }) - expect(() => { - obj.ror = true - }).toThrow() + obj.ror = true + expect( + `Set operation on key "ror" failed: target is readonly.`, + ).toHaveBeenWarned() expect(obj.ror).toBe(false) }) diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index faec3012f4..6368018192 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -153,7 +153,13 @@ class MutableReactiveHandler extends BaseReactiveHandler { } if (!isArray(target) && isRef(oldValue) && !isRef(value)) { if (isOldValueReadonly) { - return false + if (__DEV__) { + warn( + `Set operation on key "${String(key)}" failed: target is readonly.`, + target[key], + ) + } + return true } else { oldValue.value = value return true