diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index af8ebea89a1..d48900f18cc 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -52,6 +52,7 @@ export enum EffectFlags { */ ALLOW_RECURSE = 1 << 7, PAUSED = 1 << 8, + STOP = 1 << 10, } export class ReactiveEffect @@ -90,7 +91,7 @@ export class ReactiveEffect } get active(): boolean { - return !!this.flags || this.deps !== undefined + return !(this.flags & EffectFlags.STOP) } pause(): void { @@ -132,6 +133,10 @@ export class ReactiveEffect } stop(): void { + if (!this.active) { + return + } + this.flags = EffectFlags.STOP let dep = this.deps while (dep !== undefined) { dep = unlink(dep, this) @@ -140,7 +145,6 @@ export class ReactiveEffect if (sub !== undefined) { unlink(sub) } - this.flags = 0 cleanup(this) } diff --git a/packages/reactivity/src/effectScope.ts b/packages/reactivity/src/effectScope.ts index 819eb1ef73b..9d8dd546e10 100644 --- a/packages/reactivity/src/effectScope.ts +++ b/packages/reactivity/src/effectScope.ts @@ -33,7 +33,7 @@ export class EffectScope implements ReactiveNode { } get active(): boolean { - return !!this.flags || this.deps !== undefined + return !(this.flags & EffectFlags.STOP) } pause(): void { @@ -77,6 +77,10 @@ export class EffectScope implements ReactiveNode { } stop(): void { + if (!this.active) { + return + } + this.flags = EffectFlags.STOP let dep = this.deps while (dep !== undefined) { const node = dep.dep @@ -91,7 +95,6 @@ export class EffectScope implements ReactiveNode { if (sub !== undefined) { unlink(sub) } - this.flags = 0 cleanup(this) } }