浏览代码

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

Jürg Lehni 1 年之前
父节点
当前提交
0267a58801
共有 2 个文件被更改,包括 18 次插入3 次删除
  1. 15 0
      packages/reactivity/__tests__/computed.spec.ts
  2. 3 3
      packages/reactivity/src/effect.ts

+ 15 - 0
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)
+  })
 })

+ 3 - 3
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
   }
 }