Skip to content

Commit 60c2029

Browse files
committed
test: add test case for #11928
1 parent e2c19c2 commit 60c2029

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

packages/reactivity/__tests__/computed.spec.ts

+50
Original file line numberDiff line numberDiff line change
@@ -1057,4 +1057,54 @@ describe('reactivity/computed', () => {
10571057
obj.flag = 1
10581058
expect(foo).toBe(2)
10591059
})
1060+
1061+
// #11928
1062+
test('should not lead to exponential perf cost with deeply chained computed', () => {
1063+
const start = {
1064+
prop1: shallowRef(1),
1065+
prop2: shallowRef(2),
1066+
prop3: shallowRef(3),
1067+
prop4: shallowRef(4),
1068+
}
1069+
1070+
let layer = start
1071+
1072+
const LAYERS = 1000
1073+
1074+
for (let i = LAYERS; i > 0; i--) {
1075+
const m = layer
1076+
const s = {
1077+
prop1: computed(() => m.prop2.value),
1078+
prop2: computed(() => m.prop1.value - m.prop3.value),
1079+
prop3: computed(() => m.prop2.value + m.prop4.value),
1080+
prop4: computed(() => m.prop3.value),
1081+
}
1082+
effect(() => s.prop1.value)
1083+
effect(() => s.prop2.value)
1084+
effect(() => s.prop3.value)
1085+
effect(() => s.prop4.value)
1086+
1087+
s.prop1.value
1088+
s.prop2.value
1089+
s.prop3.value
1090+
s.prop4.value
1091+
1092+
layer = s
1093+
}
1094+
1095+
const t = performance.now()
1096+
start.prop1.value = 4
1097+
start.prop2.value = 3
1098+
start.prop3.value = 2
1099+
start.prop4.value = 1
1100+
expect(performance.now() - t).toBeLessThan(process.env.CI ? 100 : 30)
1101+
1102+
const end = layer
1103+
expect([
1104+
end.prop1.value,
1105+
end.prop2.value,
1106+
end.prop3.value,
1107+
end.prop4.value,
1108+
]).toMatchObject([-2, -4, 2, 3])
1109+
})
10601110
})

0 commit comments

Comments
 (0)