expect(instance).toBeDefined()
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)
+ })
})
flushPreFlushCbs,
SchedulerCb
} 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 { updateSlots } from './componentSlots'
import { pushWarningContext, popWarningContext, warn } from './warning'
updateProps(instance, nextVNode.props, prevProps, optimized)
updateSlots(instance, nextVNode.children)
+ pauseTracking()
// props update may have triggered pre-flush watchers.
// flush them before the render update.
flushPreFlushCbs(undefined, instance.update)
+ resetTracking()
}
const patchChildren: PatchChildrenFn = (