|
|
@@ -60,7 +60,7 @@ export class ReactiveEffect<T = any> {
|
|
|
/**
|
|
|
* @internal
|
|
|
*/
|
|
|
- _queryings = 0
|
|
|
+ _shouldSchedule = false
|
|
|
/**
|
|
|
* @internal
|
|
|
*/
|
|
|
@@ -76,22 +76,23 @@ export class ReactiveEffect<T = any> {
|
|
|
}
|
|
|
|
|
|
public get dirty() {
|
|
|
- if (this._dirtyLevel === DirtyLevels.ComputedValueMaybeDirty) {
|
|
|
- this._dirtyLevel = DirtyLevels.NotDirty
|
|
|
- this._queryings++
|
|
|
+ if (this._dirtyLevel === DirtyLevels.MaybeDirty) {
|
|
|
pauseTracking()
|
|
|
- for (const dep of this.deps) {
|
|
|
+ for (let i = 0; i < this._depsLength; i++) {
|
|
|
+ const dep = this.deps[i]
|
|
|
if (dep.computed) {
|
|
|
triggerComputed(dep.computed)
|
|
|
- if (this._dirtyLevel >= DirtyLevels.ComputedValueDirty) {
|
|
|
+ if (this._dirtyLevel >= DirtyLevels.Dirty) {
|
|
|
break
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ if (this._dirtyLevel < DirtyLevels.Dirty) {
|
|
|
+ this._dirtyLevel = DirtyLevels.NotDirty
|
|
|
+ }
|
|
|
resetTracking()
|
|
|
- this._queryings--
|
|
|
}
|
|
|
- return this._dirtyLevel >= DirtyLevels.ComputedValueDirty
|
|
|
+ return this._dirtyLevel >= DirtyLevels.Dirty
|
|
|
}
|
|
|
|
|
|
public set dirty(v) {
|
|
|
@@ -290,28 +291,29 @@ export function triggerEffects(
|
|
|
) {
|
|
|
pauseScheduling()
|
|
|
for (const effect of dep.keys()) {
|
|
|
- if (!effect.allowRecurse && effect._runnings) {
|
|
|
+ if (dep.get(effect) !== effect._trackId) {
|
|
|
+ // when recurse effect is running, dep map could have outdated items
|
|
|
continue
|
|
|
}
|
|
|
- if (
|
|
|
- effect._dirtyLevel < dirtyLevel &&
|
|
|
- (!effect._runnings || dirtyLevel !== DirtyLevels.ComputedValueDirty)
|
|
|
- ) {
|
|
|
+ if (effect._dirtyLevel < dirtyLevel) {
|
|
|
const lastDirtyLevel = effect._dirtyLevel
|
|
|
effect._dirtyLevel = dirtyLevel
|
|
|
- if (
|
|
|
- lastDirtyLevel === DirtyLevels.NotDirty &&
|
|
|
- (!effect._queryings || dirtyLevel !== DirtyLevels.ComputedValueDirty)
|
|
|
- ) {
|
|
|
+ if (lastDirtyLevel === DirtyLevels.NotDirty) {
|
|
|
+ effect._shouldSchedule = true
|
|
|
if (__DEV__) {
|
|
|
effect.onTrigger?.(extend({ effect }, debuggerEventExtraInfo))
|
|
|
}
|
|
|
effect.trigger()
|
|
|
- if (effect.scheduler) {
|
|
|
- queueEffectSchedulers.push(effect.scheduler)
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
+ if (
|
|
|
+ effect.scheduler &&
|
|
|
+ effect._shouldSchedule &&
|
|
|
+ (!effect._runnings || effect.allowRecurse)
|
|
|
+ ) {
|
|
|
+ effect._shouldSchedule = false
|
|
|
+ queueEffectSchedulers.push(effect.scheduler)
|
|
|
+ }
|
|
|
}
|
|
|
resetScheduling()
|
|
|
}
|