@@ -60,7 +60,7 @@ export class ReactiveEffect<T = any> {
60
60
/**
61
61
* @internal
62
62
*/
63
- _queryings = 0
63
+ _shouldSchedule = false
64
64
/**
65
65
* @internal
66
66
*/
@@ -76,22 +76,23 @@ export class ReactiveEffect<T = any> {
76
76
}
77
77
78
78
public get dirty ( ) {
79
- if ( this . _dirtyLevel === DirtyLevels . ComputedValueMaybeDirty ) {
80
- this . _dirtyLevel = DirtyLevels . NotDirty
81
- this . _queryings ++
79
+ if ( this . _dirtyLevel === DirtyLevels . MaybeDirty ) {
82
80
pauseTracking ( )
83
- for ( const dep of this . deps ) {
81
+ for ( let i = 0 ; i < this . _depsLength ; i ++ ) {
82
+ const dep = this . deps [ i ]
84
83
if ( dep . computed ) {
85
84
triggerComputed ( dep . computed )
86
- if ( this . _dirtyLevel >= DirtyLevels . ComputedValueDirty ) {
85
+ if ( this . _dirtyLevel >= DirtyLevels . Dirty ) {
87
86
break
88
87
}
89
88
}
90
89
}
90
+ if ( this . _dirtyLevel < DirtyLevels . Dirty ) {
91
+ this . _dirtyLevel = DirtyLevels . NotDirty
92
+ }
91
93
resetTracking ( )
92
- this . _queryings --
93
94
}
94
- return this . _dirtyLevel >= DirtyLevels . ComputedValueDirty
95
+ return this . _dirtyLevel >= DirtyLevels . Dirty
95
96
}
96
97
97
98
public set dirty ( v ) {
@@ -290,28 +291,29 @@ export function triggerEffects(
290
291
) {
291
292
pauseScheduling ( )
292
293
for ( const effect of dep . keys ( ) ) {
293
- if ( ! effect . allowRecurse && effect . _runnings ) {
294
+ if ( dep . get ( effect ) !== effect . _trackId ) {
295
+ // when recurse effect is running, dep map could have outdated items
294
296
continue
295
297
}
296
- if (
297
- effect . _dirtyLevel < dirtyLevel &&
298
- ( ! effect . _runnings || dirtyLevel !== DirtyLevels . ComputedValueDirty )
299
- ) {
298
+ if ( effect . _dirtyLevel < dirtyLevel ) {
300
299
const lastDirtyLevel = effect . _dirtyLevel
301
300
effect . _dirtyLevel = dirtyLevel
302
- if (
303
- lastDirtyLevel === DirtyLevels . NotDirty &&
304
- ( ! effect . _queryings || dirtyLevel !== DirtyLevels . ComputedValueDirty )
305
- ) {
301
+ if ( lastDirtyLevel === DirtyLevels . NotDirty ) {
302
+ effect . _shouldSchedule = true
306
303
if ( __DEV__ ) {
307
304
effect . onTrigger ?.( extend ( { effect } , debuggerEventExtraInfo ) )
308
305
}
309
306
effect . trigger ( )
310
- if ( effect . scheduler ) {
311
- queueEffectSchedulers . push ( effect . scheduler )
312
- }
313
307
}
314
308
}
309
+ if (
310
+ effect . scheduler &&
311
+ effect . _shouldSchedule &&
312
+ ( ! effect . _runnings || effect . allowRecurse )
313
+ ) {
314
+ effect . _shouldSchedule = false
315
+ queueEffectSchedulers . push ( effect . scheduler )
316
+ }
315
317
}
316
318
resetScheduling ( )
317
319
}
0 commit comments