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(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, | ||||
|   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' | ||||
| @ -1567,9 +1574,11 @@ function baseCreateRenderer( | ||||
|     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 = ( | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user