Просмотр исходного кода

fix(reactivity): avoid infinite recursion when mutating ref wrapped in reactive

close #11696
Evan You 1 год назад
Родитель
Сommit
313e4bf552

+ 9 - 0
packages/reactivity/__tests__/reactive.spec.ts

@@ -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()
+  })
 })

+ 6 - 1
packages/reactivity/src/baseHandlers.ts

@@ -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) {