]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(reactivity): avoid infinite recursion when mutating ref wrapped in reactive
authorEvan You <evan@vuejs.org>
Thu, 29 Aug 2024 06:10:29 +0000 (14:10 +0800)
committerEvan You <evan@vuejs.org>
Thu, 29 Aug 2024 06:10:29 +0000 (14:10 +0800)
close #11696

packages/reactivity/__tests__/reactive.spec.ts
packages/reactivity/src/baseHandlers.ts

index 1c25c49121bf4e59b82f691a5a1a173fc5e0b66c..a90ea27f1381dda744284c1d6ab2eb780c3dd879 100644 (file)
@@ -382,4 +382,13 @@ describe('reactivity/reactive', () => {
       count++
     }
   })
+
+  // #11696
+  test('should use correct receiver on set handler for refs', () => {
+    const a = reactive(ref(1))
+    effect(() => a.value)
+    expect(() => {
+      a.value++
+    }).not.toThrow()
+  })
 })
index 8f21e3540029dada0aa0a02e80492bf937e9269e..5916c0b5d8138787745f08bb12b0f780ab90f0c4 100644 (file)
@@ -165,7 +165,12 @@ class MutableReactiveHandler extends BaseReactiveHandler {
       isArray(target) && isIntegerKey(key)
         ? Number(key) < target.length
         : hasOwn(target, key)
-    const result = Reflect.set(target, key, value, receiver)
+    const result = Reflect.set(
+      target,
+      key,
+      value,
+      isRef(target) ? target : receiver,
+    )
     // don't trigger if target is something up in the prototype chain of original
     if (target === toRaw(receiver)) {
       if (!hadKey) {