@@ -2,7 +2,7 @@ import { setupRerender } from 'preact/test-utils';
2
2
import { createElement , render , Component , Fragment } from 'preact' ;
3
3
import { vi } from 'vitest' ;
4
4
import { setupScratch , teardown } from '../../_util/helpers' ;
5
- import { logCall , clearLog } from '../../_util/logCall' ;
5
+ import { logCall , getLog , clearLog } from '../../_util/logCall' ;
6
6
7
7
/** @jsx createElement */
8
8
@@ -962,4 +962,61 @@ describe('Lifecycle methods', () => {
962
962
`<div>Before</div><div>Component</div><div>After</div>`
963
963
) ;
964
964
} ) ;
965
+
966
+ it ( 'should not re-insert memoized items that keep their relative order after swap' , ( ) => {
967
+ class MemoizedItem extends Component {
968
+ shouldComponentUpdate ( nextProps ) {
969
+ return nextProps . value !== this . props . value ;
970
+ }
971
+ render ( ) {
972
+ return < div > { this . props . value } </ div > ;
973
+ }
974
+ }
975
+
976
+ const App = ( { items } ) => (
977
+ < div >
978
+ { items . map ( value => (
979
+ < MemoizedItem key = { value } value = { value } />
980
+ ) ) }
981
+ </ div >
982
+ ) ;
983
+
984
+ render ( < App items = { [ 1 , 2 , 3 , 4 , 5 , 6 , 7 ] } /> , scratch ) ;
985
+
986
+ function renderItemsAndAssert ( { items, expectedLog } ) {
987
+ clearLog ( ) ;
988
+ render ( < App items = { items } /> , scratch ) ;
989
+ expect ( scratch . innerHTML ) . to . equal (
990
+ `<div>${ items . map ( value => `<div>${ value } </div>` ) . join ( '' ) } </div>`
991
+ ) ;
992
+ expect ( getLog ( ) ) . to . deep . equal ( expectedLog ) ;
993
+ }
994
+
995
+ // Swap 1 and 7
996
+ renderItemsAndAssert ( {
997
+ items : [ 7 , 2 , 3 , 4 , 5 , 6 , 1 ] ,
998
+ expectedLog : [
999
+ '<div>1234567.insertBefore(<div>7, <div>1)' ,
1000
+ '<div>7123456.appendChild(<div>1)'
1001
+ ]
1002
+ } ) ;
1003
+
1004
+ // Swap 2 and 6
1005
+ renderItemsAndAssert ( {
1006
+ items : [ 7 , 6 , 3 , 4 , 5 , 2 , 1 ] ,
1007
+ expectedLog : [
1008
+ '<div>7234561.insertBefore(<div>6, <div>2)' ,
1009
+ '<div>7623451.insertBefore(<div>2, <div>1)'
1010
+ ]
1011
+ } ) ;
1012
+
1013
+ // Swap 3 and 5
1014
+ renderItemsAndAssert ( {
1015
+ items : [ 7 , 6 , 5 , 4 , 3 , 2 , 1 ] ,
1016
+ expectedLog : [
1017
+ '<div>7634521.insertBefore(<div>5, <div>3)' ,
1018
+ '<div>7653421.insertBefore(<div>3, <div>2)'
1019
+ ]
1020
+ } ) ;
1021
+ } ) ;
965
1022
} ) ;
0 commit comments