From 0267a588017eee4951ac2a877fe1ccae84cad905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrg=20Lehni?= Date: Sun, 22 Sep 2024 05:49:35 +0200 Subject: [PATCH] fix(reactivity): do not remove dep from depsMap when cleaning up deps of computed (#11995) --- packages/reactivity/__tests__/computed.spec.ts | 15 +++++++++++++++ packages/reactivity/src/effect.ts | 6 +++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/reactivity/__tests__/computed.spec.ts b/packages/reactivity/__tests__/computed.spec.ts index 873fd11619c..e4a337cb8b6 100644 --- a/packages/reactivity/__tests__/computed.spec.ts +++ b/packages/reactivity/__tests__/computed.spec.ts @@ -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) + }) }) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index d0b7c7bd9fb..20bbada505f 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -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 } }