From: Jürg Lehni Date: Sun, 22 Sep 2024 03:49:35 +0000 (+0200) Subject: fix(reactivity): do not remove dep from depsMap when cleaning up deps of computed... X-Git-Tag: v3.5.8~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0267a588017eee4951ac2a877fe1ccae84cad905;p=thirdparty%2Fvuejs%2Fcore.git fix(reactivity): do not remove dep from depsMap when cleaning up deps of computed (#11995) --- diff --git a/packages/reactivity/__tests__/computed.spec.ts b/packages/reactivity/__tests__/computed.spec.ts index 873fd11619..e4a337cb8b 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 d0b7c7bd9f..20bbada505 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 } }