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)
|
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', () => {
|
it('should warn if trying to set a readonly computed', () => {
|
||||||
const n = ref(1)
|
const n = ref(1)
|
||||||
const plusOne = computed(() => n.value + 1)
|
const plusOne = computed(() => n.value + 1)
|
||||||
|
@ -348,7 +348,23 @@ export function triggerEffects(
|
|||||||
debuggerEventExtraInfo?: DebuggerEventExtraInfo
|
debuggerEventExtraInfo?: DebuggerEventExtraInfo
|
||||||
) {
|
) {
|
||||||
// spread into array for stabilization
|
// spread into array for stabilization
|
||||||
for (const effect of isArray(dep) ? dep : [...dep]) {
|
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 (effect !== activeEffect || effect.allowRecurse) {
|
||||||
if (__DEV__ && effect.onTrigger) {
|
if (__DEV__ && effect.onTrigger) {
|
||||||
effect.onTrigger(extend({ effect }, debuggerEventExtraInfo))
|
effect.onTrigger(extend({ effect }, debuggerEventExtraInfo))
|
||||||
@ -359,5 +375,4 @@ export function triggerEffects(
|
|||||||
effect.run()
|
effect.run()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user