fix(reactivity): ensure computed is invalidated before other effects
fix #5720
This commit is contained in:
parent
56879e6b23
commit
82bdf86254
@ -170,6 +170,23 @@ describe('reactivity/computed', () => {
|
||||
expect(dummy).toBe(-1)
|
||||
})
|
||||
|
||||
// #5720
|
||||
it('should invalidate before non-computed effects', () => {
|
||||
let plusOneValues: number[] = []
|
||||
const n = ref(0)
|
||||
const plusOne = computed(() => n.value + 1)
|
||||
effect(() => {
|
||||
n.value
|
||||
plusOneValues.push(plusOne.value)
|
||||
})
|
||||
// access plusOne, causing it to be non-dirty
|
||||
plusOne.value
|
||||
// mutate n
|
||||
n.value++
|
||||
// on the 2nd run, plusOne.value should have already updated.
|
||||
expect(plusOneValues).toMatchObject([1, 2, 2])
|
||||
})
|
||||
|
||||
it('should warn if trying to set a readonly computed', () => {
|
||||
const n = ref(1)
|
||||
const plusOne = computed(() => n.value + 1)
|
||||
|
@ -348,16 +348,31 @@ export function triggerEffects(
|
||||
debuggerEventExtraInfo?: DebuggerEventExtraInfo
|
||||
) {
|
||||
// spread into array for stabilization
|
||||
for (const effect of isArray(dep) ? dep : [...dep]) {
|
||||
if (effect !== activeEffect || effect.allowRecurse) {
|
||||
if (__DEV__ && effect.onTrigger) {
|
||||
effect.onTrigger(extend({ effect }, debuggerEventExtraInfo))
|
||||
}
|
||||
if (effect.scheduler) {
|
||||
effect.scheduler()
|
||||
} else {
|
||||
effect.run()
|
||||
}
|
||||
const effects = isArray(dep) ? dep : [...dep]
|
||||
for (const effect of effects) {
|
||||
if (effect.computed) {
|
||||
triggerEffect(effect, debuggerEventExtraInfo)
|
||||
}
|
||||
}
|
||||
for (const effect of effects) {
|
||||
if (!effect.computed) {
|
||||
triggerEffect(effect, debuggerEventExtraInfo)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function triggerEffect(
|
||||
effect: ReactiveEffect,
|
||||
debuggerEventExtraInfo?: DebuggerEventExtraInfo
|
||||
) {
|
||||
if (effect !== activeEffect || effect.allowRecurse) {
|
||||
if (__DEV__ && effect.onTrigger) {
|
||||
effect.onTrigger(extend({ effect }, debuggerEventExtraInfo))
|
||||
}
|
||||
if (effect.scheduler) {
|
||||
effect.scheduler()
|
||||
} else {
|
||||
effect.run()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user