File tree Expand file tree Collapse file tree 1 file changed +50
-0
lines changed
packages/reactivity/__tests__ Expand file tree Collapse file tree 1 file changed +50
-0
lines changed Original file line number Diff line number Diff 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} )
You can’t perform that action at this time.
0 commit comments