|
|
@@ -77,6 +77,7 @@ export class ReactiveEffect<T = any> {
|
|
|
|
|
|
public get dirty() {
|
|
|
if (this._dirtyLevel === DirtyLevels.MaybeDirty) {
|
|
|
+ this._dirtyLevel = DirtyLevels.QueryingDirty
|
|
|
pauseTracking()
|
|
|
for (let i = 0; i < this._depsLength; i++) {
|
|
|
const dep = this.deps[i]
|
|
|
@@ -87,7 +88,7 @@ export class ReactiveEffect<T = any> {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- if (this._dirtyLevel < DirtyLevels.Dirty) {
|
|
|
+ if (this._dirtyLevel === DirtyLevels.QueryingDirty) {
|
|
|
this._dirtyLevel = DirtyLevels.NotDirty
|
|
|
}
|
|
|
resetTracking()
|
|
|
@@ -140,7 +141,7 @@ function preCleanupEffect(effect: ReactiveEffect) {
|
|
|
}
|
|
|
|
|
|
function postCleanupEffect(effect: ReactiveEffect) {
|
|
|
- if (effect.deps && effect.deps.length > effect._depsLength) {
|
|
|
+ if (effect.deps.length > effect._depsLength) {
|
|
|
for (let i = effect._depsLength; i < effect.deps.length; i++) {
|
|
|
cleanupDepEffect(effect.deps[i], effect)
|
|
|
}
|
|
|
@@ -291,35 +292,30 @@ export function triggerEffects(
|
|
|
) {
|
|
|
pauseScheduling()
|
|
|
for (const effect of dep.keys()) {
|
|
|
+ // dep.get(effect) is very expensive, we need to calculate it lazily and reuse the result
|
|
|
+ let tracking: boolean | undefined
|
|
|
if (
|
|
|
effect._dirtyLevel < dirtyLevel &&
|
|
|
- dep.get(effect) === effect._trackId
|
|
|
+ (tracking ??= dep.get(effect) === effect._trackId)
|
|
|
) {
|
|
|
- const lastDirtyLevel = effect._dirtyLevel
|
|
|
+ effect._shouldSchedule ||= effect._dirtyLevel === DirtyLevels.NotDirty
|
|
|
effect._dirtyLevel = dirtyLevel
|
|
|
- if (lastDirtyLevel === DirtyLevels.NotDirty) {
|
|
|
- effect._shouldSchedule = true
|
|
|
- if (__DEV__) {
|
|
|
- effect.onTrigger?.(extend({ effect }, debuggerEventExtraInfo))
|
|
|
- }
|
|
|
- effect.trigger()
|
|
|
- }
|
|
|
}
|
|
|
- }
|
|
|
- scheduleEffects(dep)
|
|
|
- resetScheduling()
|
|
|
-}
|
|
|
-
|
|
|
-export function scheduleEffects(dep: Dep) {
|
|
|
- for (const effect of dep.keys()) {
|
|
|
if (
|
|
|
- effect.scheduler &&
|
|
|
effect._shouldSchedule &&
|
|
|
- (!effect._runnings || effect.allowRecurse) &&
|
|
|
- dep.get(effect) === effect._trackId
|
|
|
+ (tracking ??= dep.get(effect) === effect._trackId)
|
|
|
) {
|
|
|
- effect._shouldSchedule = false
|
|
|
- queueEffectSchedulers.push(effect.scheduler)
|
|
|
+ if (__DEV__) {
|
|
|
+ effect.onTrigger?.(extend({ effect }, debuggerEventExtraInfo))
|
|
|
+ }
|
|
|
+ effect.trigger()
|
|
|
+ if (!effect._runnings || effect.allowRecurse) {
|
|
|
+ effect._shouldSchedule = false
|
|
|
+ if (effect.scheduler) {
|
|
|
+ queueEffectSchedulers.push(effect.scheduler)
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ resetScheduling()
|
|
|
}
|