Skip to content

Commit e8e6772

Browse files
committed
fix(reactivity): effect should handle self dependency mutations
1 parent e1c9153 commit e8e6772

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

packages/reactivity/__tests__/effect.spec.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import {
66
TrackOpTypes,
77
TriggerOpTypes,
88
DebuggerEvent,
9-
markNonReactive
9+
markNonReactive,
10+
ref
1011
} from '../src/index'
1112
import { ITERATE_KEY } from '../src/effect'
1213

@@ -735,4 +736,14 @@ describe('reactivity/effect', () => {
735736
obj.foo = NaN
736737
expect(fnSpy).toHaveBeenCalledTimes(1)
737738
})
739+
740+
it('should handle self dependency mutations', () => {
741+
const count = ref(0)
742+
effect(() => {
743+
count.value++
744+
})
745+
expect(count.value).toBe(1)
746+
count.value = 10
747+
expect(count.value).toBe(11)
748+
})
738749
})

packages/reactivity/src/effect.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,10 +210,16 @@ function addRunners(
210210
) {
211211
if (effectsToAdd !== void 0) {
212212
effectsToAdd.forEach(effect => {
213-
if (effect.options.computed) {
214-
computedRunners.add(effect)
213+
if (effect !== activeEffect) {
214+
if (effect.options.computed) {
215+
computedRunners.add(effect)
216+
} else {
217+
effects.add(effect)
218+
}
215219
} else {
216-
effects.add(effect)
220+
// the effect mutated its own dependency during its execution.
221+
// this can be caused by operations like foo.value++
222+
// do not trigger or we end in an infinite loop
217223
}
218224
})
219225
}

0 commit comments

Comments
 (0)