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)
+ })
})
}
}
-function cleanupDeps(sub: Subscriber) {
+function cleanupDeps(sub: Subscriber, fromComputed = false) {
// Cleanup unsued deps
let head
let tail = sub.depsTail
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 {
} finally {
activeSub = prevSub
shouldTrack = prevShouldTrack
- cleanupDeps(computed)
+ cleanupDeps(computed, true)
computed.flags &= ~EffectFlags.RUNNING
}
}