fix(reactivity): effect should handle self dependency mutations
This commit is contained in:
parent
e1c9153b9e
commit
e8e67729cb
@ -6,7 +6,8 @@ import {
|
|||||||
TrackOpTypes,
|
TrackOpTypes,
|
||||||
TriggerOpTypes,
|
TriggerOpTypes,
|
||||||
DebuggerEvent,
|
DebuggerEvent,
|
||||||
markNonReactive
|
markNonReactive,
|
||||||
|
ref
|
||||||
} from '../src/index'
|
} from '../src/index'
|
||||||
import { ITERATE_KEY } from '../src/effect'
|
import { ITERATE_KEY } from '../src/effect'
|
||||||
|
|
||||||
@ -735,4 +736,14 @@ describe('reactivity/effect', () => {
|
|||||||
obj.foo = NaN
|
obj.foo = NaN
|
||||||
expect(fnSpy).toHaveBeenCalledTimes(1)
|
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)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
@ -210,11 +210,17 @@ function addRunners(
|
|||||||
) {
|
) {
|
||||||
if (effectsToAdd !== void 0) {
|
if (effectsToAdd !== void 0) {
|
||||||
effectsToAdd.forEach(effect => {
|
effectsToAdd.forEach(effect => {
|
||||||
|
if (effect !== activeEffect) {
|
||||||
if (effect.options.computed) {
|
if (effect.options.computed) {
|
||||||
computedRunners.add(effect)
|
computedRunners.add(effect)
|
||||||
} else {
|
} else {
|
||||||
effects.add(effect)
|
effects.add(effect)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// 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
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user