From e8e67729cb7649d736be233b2a5e00768dd6f4ba Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 18 Feb 2020 13:22:09 -0500 Subject: [PATCH] fix(reactivity): effect should handle self dependency mutations --- packages/reactivity/__tests__/effect.spec.ts | 13 ++++++++++++- packages/reactivity/src/effect.ts | 12 +++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/reactivity/__tests__/effect.spec.ts b/packages/reactivity/__tests__/effect.spec.ts index a5a3a372838..369cda983ff 100644 --- a/packages/reactivity/__tests__/effect.spec.ts +++ b/packages/reactivity/__tests__/effect.spec.ts @@ -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) + }) }) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 949deb5dd50..f4cac6d4edc 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -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 } }) }