From ef432bda777d8c73e7d66b4d70bb7a5f3d2aa60f Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 11 Dec 2023 18:40:25 +0800 Subject: [PATCH] refactor(reactivity): improve nested readonly ref set check ref #9094 --- packages/reactivity/src/baseHandlers.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index 7a73a09acdd..3876db4cdf2 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