]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor(reactivity): improve nested readonly ref set check
authorEvan You <yyx990803@gmail.com>
Mon, 11 Dec 2023 10:40:25 +0000 (18:40 +0800)
committerEvan You <yyx990803@gmail.com>
Mon, 11 Dec 2023 10:40:55 +0000 (18:40 +0800)
ref #9094

packages/reactivity/src/baseHandlers.ts

index 7a73a09acdd5250f4fa0ad4f69ae21fa9ee44af8..3876db4cdf21e8a3318be969ba49d6f9042e1968 100644 (file)
@@ -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