]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(reactivity): effect should handle self dependency mutations
authorEvan You <yyx990803@gmail.com>
Tue, 18 Feb 2020 18:22:09 +0000 (13:22 -0500)
committerEvan You <yyx990803@gmail.com>
Tue, 18 Feb 2020 18:22:09 +0000 (13:22 -0500)
packages/reactivity/__tests__/effect.spec.ts
packages/reactivity/src/effect.ts

index a5a3a372838ea01052ce830a3f47251d4d0de57f..369cda983fff40bd7c9f8d037dc225da3835bb82 100644 (file)
@@ -6,7 +6,8 @@ import {
   TrackOpTypes,
   TriggerOpTypes,
   DebuggerEvent,
-  markNonReactive
+  markNonReactive,
+  ref
 } from '../src/index'
 import { ITERATE_KEY } from '../src/effect'
 
@@ -735,4 +736,14 @@ describe('reactivity/effect', () => {
     obj.foo = NaN
     expect(fnSpy).toHaveBeenCalledTimes(1)
   })
+
+  it('should handle self dependency mutations', () => {
+    const count = ref(0)
+    effect(() => {
+      count.value++
+    })
+    expect(count.value).toBe(1)
+    count.value = 10
+    expect(count.value).toBe(11)
+  })
 })
index 949deb5dd50374fe68ad4627981422e3a824bc44..f4cac6d4edc3910b922edafb9523434abdbd488b 100644 (file)
@@ -210,10 +210,16 @@ function addRunners(
 ) {
   if (effectsToAdd !== void 0) {
     effectsToAdd.forEach(effect => {
-      if (effect.options.computed) {
-        computedRunners.add(effect)
+      if (effect !== activeEffect) {
+        if (effect.options.computed) {
+          computedRunners.add(effect)
+        } else {
+          effects.add(effect)
+        }
       } else {
-        effects.add(effect)
+        // the effect mutated its own dependency during its execution.
+        // this can be caused by operations like foo.value++
+        // do not trigger or we end in an infinite loop
       }
     })
   }