@@ -2,7 +2,7 @@ import { setupRerender } from 'preact/test-utils';
22import { createElement , render , Component , Fragment } from 'preact' ;
33import { vi } from 'vitest' ;
44import { setupScratch , teardown } from '../../_util/helpers' ;
5- import { logCall , clearLog } from '../../_util/logCall' ;
5+ import { logCall , getLog , clearLog } from '../../_util/logCall' ;
66
77/** @jsx createElement */
88
@@ -962,4 +962,61 @@ describe('Lifecycle methods', () => {
962962 `<div>Before</div><div>Component</div><div>After</div>`
963963 ) ;
964964 } ) ;
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+ } ) ;
9651022} ) ;
0 commit comments