fix(reactivity): do not remove dep from depsMap when cleaning up deps of computed (#11995)

This commit is contained in:
Jürg Lehni 2024-09-22 05:49:35 +02:00 committed by GitHub
parent d1764a142a
commit 0267a58801
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 18 additions and 3 deletions

View File

@ -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)
})
})

View File

@ -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
@ -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 {
@ -394,7 +394,7 @@ export function refreshComputed(computed: ComputedRefImpl): undefined {
} finally {
activeSub = prevSub
shouldTrack = prevShouldTrack
cleanupDeps(computed)
cleanupDeps(computed, true)
computed.flags &= ~EffectFlags.RUNNING
}
}