Просмотр исходного кода

fix(reactivity): add back STOP flag (#13605)

Johnson Chu 11 месяцев назад
Родитель
Сommit
b4d8e7184c
2 измененных файлов с 11 добавлено и 4 удалено
  1. 6 2
      packages/reactivity/src/effect.ts
  2. 5 2
      packages/reactivity/src/effectScope.ts

+ 6 - 2
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<T = any>
@@ -90,7 +91,7 @@ export class ReactiveEffect<T = any>
   }
 
   get active(): boolean {
-    return !!this.flags || this.deps !== undefined
+    return !(this.flags & EffectFlags.STOP)
   }
 
   pause(): void {
@@ -132,6 +133,10 @@ export class ReactiveEffect<T = any>
   }
 
   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<T = any>
     if (sub !== undefined) {
       unlink(sub)
     }
-    this.flags = 0
     cleanup(this)
   }
 

+ 5 - 2
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)
   }
 }