From: Evan You Date: Tue, 18 Feb 2020 18:22:09 +0000 (-0500) Subject: fix(reactivity): effect should handle self dependency mutations X-Git-Tag: v3.0.0-alpha.5~9 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e8e67729cb7649d736be233b2a5e00768dd6f4ba;p=thirdparty%2Fvuejs%2Fcore.git fix(reactivity): effect should handle self dependency mutations --- diff --git a/packages/reactivity/__tests__/effect.spec.ts b/packages/reactivity/__tests__/effect.spec.ts index a5a3a37283..369cda983f 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 949deb5dd5..f4cac6d4ed 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 } }) }