From: Evan You Date: Mon, 11 Dec 2023 10:40:25 +0000 (+0800) Subject: refactor(reactivity): improve nested readonly ref set check X-Git-Tag: v3.4.0-beta.1~23^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ef432bda777d8c73e7d66b4d70bb7a5f3d2aa60f;p=thirdparty%2Fvuejs%2Fcore.git refactor(reactivity): improve nested readonly ref set check ref #9094 --- diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index 7a73a09acd..3876db4cdf 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -174,17 +174,19 @@ class MutableReactiveHandler extends BaseReactiveHandler { receiver: object ): boolean { let oldValue = (target as any)[key] - if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) { - return false - } if (!this._shallow) { + const isOldValueReadonly = isReadonly(oldValue) if (!isShallow(value) && !isReadonly(value)) { oldValue = toRaw(oldValue) value = toRaw(value) } if (!isArray(target) && isRef(oldValue) && !isRef(value)) { - oldValue.value = value - return true + if (isOldValueReadonly) { + return false + } else { + oldValue.value = value + return true + } } } else { // in shallow mode, objects are set as-is regardless of reactive or not