Skip to content

Commit c1b1398

Browse files
committed
fix(reactivity): cleanup subsHead in DEV + remove dep from depsMap during remove sub
1 parent e075dfa commit c1b1398

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

packages/reactivity/src/dep.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@ export class Dep {
8282
*/
8383
subsHead?: Link
8484

85+
/**
86+
* Delete itself from depsMap
87+
*/
88+
cleanup?: () => void
89+
8590
constructor(public computed?: ComputedRefImpl | undefined) {
8691
if (__DEV__) {
8792
this.subsHead = undefined
@@ -249,6 +254,7 @@ export function track(target: object, type: TrackOpTypes, key: unknown): void {
249254
let dep = depsMap.get(key)
250255
if (!dep) {
251256
depsMap.set(key, (dep = new Dep()))
257+
dep.cleanup = () => depsMap.delete(key)
252258
}
253259
if (__DEV__) {
254260
dep.track({

packages/reactivity/src/effect.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -414,14 +414,22 @@ function removeSub(link: Link) {
414414
dep.subs = prevSub
415415
}
416416

417-
if (!dep.subs && dep.computed) {
417+
if (!dep.subs) {
418418
// last subscriber removed
419419
// if computed, unsubscribe it from all its deps so this computed and its
420420
// value can be GCed
421-
dep.computed.flags &= ~EffectFlags.TRACKING
422-
for (let l = dep.computed.deps; l; l = l.nextDep) {
423-
removeSub(l)
421+
if (dep.computed) {
422+
dep.computed.flags &= ~EffectFlags.TRACKING
423+
for (let l = dep.computed.deps; l; l = l.nextDep) {
424+
removeSub(l)
425+
}
424426
}
427+
428+
// cleanup subsHead
429+
if (__DEV__ && prevSub === undefined) dep.subsHead = undefined
430+
431+
// remove the dep from depsMap
432+
if (dep.cleanup) dep.cleanup()
425433
}
426434
}
427435

0 commit comments

Comments
 (0)