]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
test: add test case for #11928
authorEvan You <evan@vuejs.org>
Fri, 27 Sep 2024 03:06:34 +0000 (11:06 +0800)
committerEvan You <evan@vuejs.org>
Fri, 27 Sep 2024 03:06:34 +0000 (11:06 +0800)
packages/reactivity/__tests__/computed.spec.ts

index 8e9b048e6f38772619914c46e9089712fb71c380..36c477adb88bda1c80b1940720d72186b3bf6fb4 100644 (file)
@@ -1057,4 +1057,54 @@ describe('reactivity/computed', () => {
     obj.flag = 1
     expect(foo).toBe(2)
   })
+
+  // #11928
+  test('should not lead to exponential perf cost with deeply chained computed', () => {
+    const start = {
+      prop1: shallowRef(1),
+      prop2: shallowRef(2),
+      prop3: shallowRef(3),
+      prop4: shallowRef(4),
+    }
+
+    let layer = start
+
+    const LAYERS = 1000
+
+    for (let i = LAYERS; i > 0; i--) {
+      const m = layer
+      const s = {
+        prop1: computed(() => m.prop2.value),
+        prop2: computed(() => m.prop1.value - m.prop3.value),
+        prop3: computed(() => m.prop2.value + m.prop4.value),
+        prop4: computed(() => m.prop3.value),
+      }
+      effect(() => s.prop1.value)
+      effect(() => s.prop2.value)
+      effect(() => s.prop3.value)
+      effect(() => s.prop4.value)
+
+      s.prop1.value
+      s.prop2.value
+      s.prop3.value
+      s.prop4.value
+
+      layer = s
+    }
+
+    const t = performance.now()
+    start.prop1.value = 4
+    start.prop2.value = 3
+    start.prop3.value = 2
+    start.prop4.value = 1
+    expect(performance.now() - t).toBeLessThan(process.env.CI ? 100 : 30)
+
+    const end = layer
+    expect([
+      end.prop1.value,
+      end.prop2.value,
+      end.prop3.value,
+      end.prop4.value,
+    ]).toMatchObject([-2, -4, 2, 3])
+  })
 })