@@ -46,6 +46,7 @@ export class ReactiveEffect<T = any> {
46
46
47
47
_dirtyLevel = DirtyLevels . Dirty
48
48
_queryingDirty = false
49
+ _trackToken = new WeakRef ( this )
49
50
_trackId = 0
50
51
_runnings = 0
51
52
_depsLength = 0
@@ -131,9 +132,9 @@ function postCleanupEffect(effect: ReactiveEffect) {
131
132
}
132
133
133
134
function cleanupDepEffect ( dep : Dep , effect : ReactiveEffect ) {
134
- const trackId = dep . get ( effect )
135
+ const trackId = dep . get ( effect . _trackToken )
135
136
if ( trackId !== undefined && effect . _trackId !== trackId ) {
136
- dep . delete ( effect )
137
+ dep . delete ( effect . _trackToken )
137
138
if ( dep . size === 0 ) {
138
139
dep . cleanup ( )
139
140
}
@@ -255,8 +256,8 @@ export function trackEffect(
255
256
dep : Dep ,
256
257
debuggerEventExtraInfo ?: DebuggerEventExtraInfo
257
258
) {
258
- if ( dep . get ( effect ) !== effect . _trackId ) {
259
- dep . set ( effect , effect . _trackId )
259
+ if ( dep . get ( effect . _trackToken ) !== effect . _trackId ) {
260
+ dep . set ( effect . _trackToken , effect . _trackId )
260
261
const oldDep = effect . deps [ effect . _depsLength ]
261
262
if ( oldDep !== dep ) {
262
263
if ( oldDep ) {
@@ -281,7 +282,14 @@ export function triggerEffects(
281
282
debuggerEventExtraInfo ?: DebuggerEventExtraInfo
282
283
) {
283
284
pauseScheduling ( )
284
- for ( const effect of dep . keys ( ) ) {
285
+ let reclaimedTokens : WeakRef < ReactiveEffect > [ ] | undefined
286
+ for ( const trackToken of dep . keys ( ) ) {
287
+ const effect = trackToken . deref ( )
288
+ if ( ! effect ) {
289
+ reclaimedTokens ??= [ ]
290
+ reclaimedTokens . push ( trackToken )
291
+ continue
292
+ }
285
293
if ( ! effect . allowRecurse && effect . _runnings ) {
286
294
continue
287
295
}
@@ -303,5 +311,10 @@ export function triggerEffects(
303
311
}
304
312
}
305
313
}
314
+ if ( reclaimedTokens ) {
315
+ for ( const token of reclaimedTokens ) {
316
+ dep . delete ( token )
317
+ }
318
+ }
306
319
resetScheduling ( )
307
320
}
0 commit comments