@@ -3,10 +3,9 @@ import type { TrackOpTypes, TriggerOpTypes } from './constants'
33import { setupOnTrigger } from './debug'
44import { activeEffectScope } from './effectScope'
55import {
6- type Dependency ,
76 type Link ,
8- type Subscriber ,
9- SubscriberFlags ,
7+ ReactiveFlags ,
8+ type ReactiveNode ,
109 checkDirty ,
1110 endTracking ,
1211 link ,
@@ -18,7 +17,7 @@ import { warn } from './warning'
1817export type EffectScheduler = ( ...args : any [ ] ) => any
1918
2019export type DebuggerEvent = {
21- effect : Subscriber
20+ effect : ReactiveNode
2221} & DebuggerEventExtraInfo
2322
2423export type DebuggerEventExtraInfo = {
@@ -55,16 +54,13 @@ export enum EffectFlags {
5554}
5655
5756export class ReactiveEffect < T = any >
58- implements ReactiveEffectOptions , Dependency , Subscriber
57+ implements ReactiveEffectOptions , ReactiveNode
5958{
60- // Subscriber
6159 deps : Link | undefined = undefined
6260 depsTail : Link | undefined = undefined
63- flags : number = SubscriberFlags . Dirty
64-
65- // Dependency
6661 subs : Link | undefined = undefined
6762 subsTail : Link | undefined = undefined
63+ flags : number = ReactiveFlags . Watching | ReactiveFlags . Dirty
6864
6965 /**
7066 * @internal
@@ -129,6 +125,9 @@ export class ReactiveEffect<T = any>
129125 }
130126
131127 run ( ) : T {
128+ if ( ! this . active ) {
129+ return this . fn ( )
130+ }
132131 cleanup ( this )
133132 const prevSub = activeSub
134133 setActiveSub ( this )
@@ -147,10 +146,10 @@ export class ReactiveEffect<T = any>
147146 endTracking ( this )
148147 const flags = this . flags
149148 if (
150- ( flags & ( SubscriberFlags . Recursed | EffectFlags . ALLOW_RECURSE ) ) ===
151- ( SubscriberFlags . Recursed | EffectFlags . ALLOW_RECURSE )
149+ ( flags & ( ReactiveFlags . Recursed | EffectFlags . ALLOW_RECURSE ) ) ===
150+ ( ReactiveFlags . Recursed | EffectFlags . ALLOW_RECURSE )
152151 ) {
153- this . flags = flags & ~ SubscriberFlags . Recursed
152+ this . flags = flags & ~ ReactiveFlags . Recursed
154153 this . notify ( )
155154 }
156155 }
@@ -161,23 +160,25 @@ export class ReactiveEffect<T = any>
161160 if ( sub !== undefined ) {
162161 unlink ( sub )
163162 }
164- startTracking ( this )
165- endTracking ( this )
166- cleanup ( this )
163+ let dep = this . deps
164+ while ( dep !== undefined ) {
165+ dep = unlink ( dep , this )
166+ }
167167 this . flags = 0
168+ cleanup ( this )
168169 }
169170
170171 get dirty ( ) : boolean {
171172 const flags = this . flags
172- if ( flags & SubscriberFlags . Dirty ) {
173+ if ( flags & ReactiveFlags . Dirty ) {
173174 return true
174175 }
175- if ( flags & SubscriberFlags . Pending ) {
176- if ( checkDirty ( this . deps ! ) ) {
177- this . flags = flags | SubscriberFlags . Dirty
176+ if ( flags & ReactiveFlags . Pending ) {
177+ if ( checkDirty ( this . deps ! , this ) ) {
178+ this . flags = flags | ReactiveFlags . Dirty
178179 return true
179180 } else {
180- this . flags = flags & ~ SubscriberFlags . Pending
181+ this . flags = flags & ~ ReactiveFlags . Pending
181182 }
182183 }
183184 return false
@@ -234,7 +235,7 @@ export function stop(runner: ReactiveEffectRunner): void {
234235 runner . effect . stop ( )
235236}
236237
237- const resetTrackingStack : ( Subscriber | undefined ) [ ] = [ ]
238+ const resetTrackingStack : ( ReactiveNode | undefined ) [ ] = [ ]
238239
239240/**
240241 * Temporarily pauses tracking.
@@ -284,7 +285,7 @@ export function resetTracking(): void {
284285}
285286
286287export function cleanup (
287- sub : Subscriber & { cleanups : ( ( ) => void ) [ ] ; cleanupsLength : number } ,
288+ sub : ReactiveNode & { cleanups : ( ( ) => void ) [ ] ; cleanupsLength : number } ,
288289) : void {
289290 const l = sub . cleanupsLength
290291 if ( l ) {
@@ -329,8 +330,8 @@ function cleanupEffect(fn: () => void) {
329330 }
330331}
331332
332- export let activeSub : Subscriber | undefined = undefined
333+ export let activeSub : ReactiveNode | undefined = undefined
333334
334- export function setActiveSub ( sub : Subscriber | undefined ) : void {
335+ export function setActiveSub ( sub : ReactiveNode | undefined ) : void {
335336 activeSub = sub
336337}
0 commit comments