@@ -45,7 +45,6 @@ export type DebuggerEventExtraInfo = {
45
45
oldTarget ?: Map < any , any > | Set < any >
46
46
}
47
47
48
- const effectStack : ReactiveEffect [ ] = [ ]
49
48
let activeEffect : ReactiveEffect | undefined
50
49
51
50
export const ITERATE_KEY = Symbol ( __DEV__ ? 'iterate' : '' )
@@ -54,6 +53,7 @@ export const MAP_KEY_ITERATE_KEY = Symbol(__DEV__ ? 'Map key iterate' : '')
54
53
export class ReactiveEffect < T = any > {
55
54
active = true
56
55
deps : Dep [ ] = [ ]
56
+ parent : ReactiveEffect | undefined = undefined
57
57
58
58
/**
59
59
* Can be attached after creation
@@ -74,7 +74,7 @@ export class ReactiveEffect<T = any> {
74
74
constructor (
75
75
public fn : ( ) => T ,
76
76
public scheduler : EffectScheduler | null = null ,
77
- scope ?: EffectScope | null
77
+ scope ?: EffectScope
78
78
) {
79
79
recordEffectScope ( this , scope )
80
80
}
@@ -83,31 +83,37 @@ export class ReactiveEffect<T = any> {
83
83
if ( ! this . active ) {
84
84
return this . fn ( )
85
85
}
86
- if ( ! effectStack . length || ! effectStack . includes ( this ) ) {
87
- try {
88
- effectStack . push ( ( activeEffect = this ) )
89
- enableTracking ( )
86
+ let parent : ReactiveEffect | undefined = activeEffect
87
+ let lastShouldTrack = shouldTrack
88
+ while ( parent ) {
89
+ if ( parent === this ) {
90
+ return
91
+ }
92
+ parent = parent . parent
93
+ }
94
+ try {
95
+ this . parent = activeEffect
96
+ activeEffect = this
97
+ shouldTrack = true
90
98
91
- trackOpBit = 1 << ++ effectTrackDepth
99
+ trackOpBit = 1 << ++ effectTrackDepth
92
100
93
- if ( effectTrackDepth <= maxMarkerBits ) {
94
- initDepMarkers ( this )
95
- } else {
96
- cleanupEffect ( this )
97
- }
98
- return this . fn ( )
99
- } finally {
100
- if ( effectTrackDepth <= maxMarkerBits ) {
101
- finalizeDepMarkers ( this )
102
- }
101
+ if ( effectTrackDepth <= maxMarkerBits ) {
102
+ initDepMarkers ( this )
103
+ } else {
104
+ cleanupEffect ( this )
105
+ }
106
+ return this . fn ( )
107
+ } finally {
108
+ if ( effectTrackDepth <= maxMarkerBits ) {
109
+ finalizeDepMarkers ( this )
110
+ }
103
111
104
- trackOpBit = 1 << -- effectTrackDepth
112
+ trackOpBit = 1 << -- effectTrackDepth
105
113
106
- resetTracking ( )
107
- effectStack . pop ( )
108
- const n = effectStack . length
109
- activeEffect = n > 0 ? effectStack [ n - 1 ] : undefined
110
- }
114
+ activeEffect = this . parent
115
+ shouldTrack = lastShouldTrack
116
+ this . parent = undefined
111
117
}
112
118
}
113
119
@@ -214,7 +220,7 @@ export function track(target: object, type: TrackOpTypes, key: unknown) {
214
220
}
215
221
216
222
export function isTracking ( ) {
217
- return shouldTrack && activeEffect !== undefined
223
+ return shouldTrack && ! ! activeEffect
218
224
}
219
225
220
226
export function trackEffects (
0 commit comments