Skip to content

Commit

Permalink
fix(reactivity): do not remove dep from depsMap when cleaning up deps…
Browse files Browse the repository at this point in the history
… of computed (#11995)
  • Loading branch information
lehni authored Sep 22, 2024
1 parent d1764a1 commit 0267a58
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 3 deletions.
15 changes: 15 additions & 0 deletions packages/reactivity/__tests__/computed.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1022,4 +1022,19 @@ describe('reactivity/computed', () => {
state.a++
expect(p.value).toBe(3)
})

test('computed dep cleanup should not cause property dep to be deleted', () => {
const toggle = ref(true)
const state = reactive({ a: 1 })
const p = computed(() => {
return toggle.value ? state.a : 111
})
const pp = computed(() => state.a)
effect(() => p.value)

expect(pp.value).toBe(1)
toggle.value = false
state.a++
expect(pp.value).toBe(2)
})
})
6 changes: 3 additions & 3 deletions packages/reactivity/src/effect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ function prepareDeps(sub: Subscriber) {
}
}

function cleanupDeps(sub: Subscriber) {
function cleanupDeps(sub: Subscriber, fromComputed = false) {
// Cleanup unsued deps
let head
let tail = sub.depsTail
Expand All @@ -302,7 +302,7 @@ function cleanupDeps(sub: Subscriber) {
if (link.version === -1) {
if (link === tail) tail = prev
// unused - remove it from the dep's subscribing effect list
removeSub(link)
removeSub(link, fromComputed)
// also remove it from this effect's dep list
removeDep(link)
} else {
Expand Down Expand Up @@ -394,7 +394,7 @@ export function refreshComputed(computed: ComputedRefImpl): undefined {
} finally {
activeSub = prevSub
shouldTrack = prevShouldTrack
cleanupDeps(computed)
cleanupDeps(computed, true)
computed.flags &= ~EffectFlags.RUNNING
}
}
Expand Down

0 comments on commit 0267a58

Please sign in to comment.