fix(runtime-core): should not track deps in pre flush watcher callbacks
fix #2728
This commit is contained in:
parent
22cc4a7659
commit
d5824b97c5
@ -877,4 +877,42 @@ describe('api: watch', () => {
|
|||||||
expect(instance).toBeDefined()
|
expect(instance).toBeDefined()
|
||||||
expect(source).toHaveBeenCalledWith(instance)
|
expect(source).toHaveBeenCalledWith(instance)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// #2728
|
||||||
|
test('pre watcher callbacks should not track dependencies', async () => {
|
||||||
|
const a = ref(0)
|
||||||
|
const b = ref(0)
|
||||||
|
const updated = jest.fn()
|
||||||
|
|
||||||
|
const Child = defineComponent({
|
||||||
|
props: ['a'],
|
||||||
|
updated,
|
||||||
|
watch: {
|
||||||
|
a() {
|
||||||
|
b.value
|
||||||
|
}
|
||||||
|
},
|
||||||
|
render() {
|
||||||
|
return h('div', this.a)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const Parent = defineComponent({
|
||||||
|
render() {
|
||||||
|
return h(Child, { a: a.value })
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const root = nodeOps.createElement('div')
|
||||||
|
createApp(Parent).mount(root)
|
||||||
|
|
||||||
|
a.value++
|
||||||
|
await nextTick()
|
||||||
|
expect(updated).toHaveBeenCalledTimes(1)
|
||||||
|
|
||||||
|
b.value++
|
||||||
|
await nextTick()
|
||||||
|
// should not track b as dependency of Child
|
||||||
|
expect(updated).toHaveBeenCalledTimes(1)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
@ -48,7 +48,14 @@ import {
|
|||||||
flushPreFlushCbs,
|
flushPreFlushCbs,
|
||||||
SchedulerCb
|
SchedulerCb
|
||||||
} from './scheduler'
|
} from './scheduler'
|
||||||
import { effect, stop, ReactiveEffectOptions, isRef } from '@vue/reactivity'
|
import {
|
||||||
|
effect,
|
||||||
|
stop,
|
||||||
|
ReactiveEffectOptions,
|
||||||
|
isRef,
|
||||||
|
pauseTracking,
|
||||||
|
resetTracking
|
||||||
|
} from '@vue/reactivity'
|
||||||
import { updateProps } from './componentProps'
|
import { updateProps } from './componentProps'
|
||||||
import { updateSlots } from './componentSlots'
|
import { updateSlots } from './componentSlots'
|
||||||
import { pushWarningContext, popWarningContext, warn } from './warning'
|
import { pushWarningContext, popWarningContext, warn } from './warning'
|
||||||
@ -1567,9 +1574,11 @@ function baseCreateRenderer(
|
|||||||
updateProps(instance, nextVNode.props, prevProps, optimized)
|
updateProps(instance, nextVNode.props, prevProps, optimized)
|
||||||
updateSlots(instance, nextVNode.children)
|
updateSlots(instance, nextVNode.children)
|
||||||
|
|
||||||
|
pauseTracking()
|
||||||
// props update may have triggered pre-flush watchers.
|
// props update may have triggered pre-flush watchers.
|
||||||
// flush them before the render update.
|
// flush them before the render update.
|
||||||
flushPreFlushCbs(undefined, instance.update)
|
flushPreFlushCbs(undefined, instance.update)
|
||||||
|
resetTracking()
|
||||||
}
|
}
|
||||||
|
|
||||||
const patchChildren: PatchChildrenFn = (
|
const patchChildren: PatchChildrenFn = (
|
||||||
|
Loading…
Reference in New Issue
Block a user