@@ -426,20 +426,20 @@ describe('createFor', () => {
426426 '<li>0. 1</li><li>1. 2</li><li>2. 3</li><li>3. 4</li><!--for-->' ,
427427 )
428428
429- // change deep value should not update
429+ // change deep value and refresh source
430430 list . value [ 0 ] . name = 'a'
431431 setList ( )
432432 await nextTick ( )
433433 expect ( host . innerHTML ) . toBe (
434- '<li>0. 1 </li><li>1. 2</li><li>2. 3</li><li>3. 4</li><!--for-->' ,
434+ '<li>0. a </li><li>1. 2</li><li>2. 3</li><li>3. 4</li><!--for-->' ,
435435 )
436436
437437 // remove
438438 list . value . splice ( 1 , 1 )
439439 setList ( )
440440 await nextTick ( )
441441 expect ( host . innerHTML ) . toBe (
442- '<li>0. 1 </li><li>1. 3</li><li>2. 4</li><!--for-->' ,
442+ '<li>0. a </li><li>1. 3</li><li>2. 4</li><!--for-->' ,
443443 )
444444
445445 // clear
@@ -448,6 +448,82 @@ describe('createFor', () => {
448448 expect ( host . innerHTML ) . toBe ( '<!--for-->' )
449449 } )
450450
451+ test ( 'should update same item references when source is refreshed' , async ( ) => {
452+ let rawList = [ { number : 0 } , { number : 1 } ]
453+ const list = shallowRef ( rawList )
454+
455+ const { host } = define ( ( ) => {
456+ const n1 = createFor (
457+ ( ) => list . value ,
458+ item => {
459+ const span = document . createElement ( 'li' )
460+ renderEffect ( ( ) => {
461+ span . textContent = JSON . stringify ( item . value )
462+ } )
463+ return span
464+ } ,
465+ ( _item , key ) => `${ key } -test` ,
466+ )
467+ return n1
468+ } ) . render ( )
469+
470+ expect ( host . innerHTML ) . toBe (
471+ '<li>{"number":0}</li><li>{"number":1}</li><!--for-->' ,
472+ )
473+
474+ rawList [ 0 ] . number = 2
475+ list . value = rawList . slice ( )
476+ await nextTick ( )
477+ expect ( host . innerHTML ) . toBe (
478+ '<li>{"number":2}</li><li>{"number":1}</li><!--for-->' ,
479+ )
480+
481+ list . value [ 0 ] . number = 3
482+ triggerRef ( list )
483+ await nextTick ( )
484+ expect ( host . innerHTML ) . toBe (
485+ '<li>{"number":3}</li><li>{"number":1}</li><!--for-->' ,
486+ )
487+
488+ rawList = [ { number : 0 } , { number : 1 } ]
489+ list . value = rawList
490+ await nextTick ( )
491+ expect ( host . innerHTML ) . toBe (
492+ '<li>{"number":0}</li><li>{"number":1}</li><!--for-->' ,
493+ )
494+ } )
495+
496+ test ( 'should update same reactive item references when source is replaced' , async ( ) => {
497+ const rawList = [ { number : 0 } , { number : 1 } ]
498+ const list = ref ( rawList )
499+
500+ const { host } = define ( ( ) => {
501+ const n1 = createFor (
502+ ( ) => list . value ,
503+ item => {
504+ const span = document . createElement ( 'li' )
505+ renderEffect ( ( ) => {
506+ span . textContent = JSON . stringify ( item . value )
507+ } )
508+ return span
509+ } ,
510+ ( _item , key ) => `${ key } -test` ,
511+ )
512+ return n1
513+ } ) . render ( )
514+
515+ expect ( host . innerHTML ) . toBe (
516+ '<li>{"number":0}</li><li>{"number":1}</li><!--for-->' ,
517+ )
518+
519+ rawList [ 0 ] . number = 2
520+ list . value = rawList . slice ( )
521+ await nextTick ( )
522+ expect ( host . innerHTML ) . toBe (
523+ '<li>{"number":2}</li><li>{"number":1}</li><!--for-->' ,
524+ )
525+ } )
526+
451527 test ( 'should optimize call frequency during list operations' , async ( ) => {
452528 let sourceCalledTimes = 0
453529 let renderCalledTimes = 0
@@ -519,6 +595,14 @@ describe('createFor', () => {
519595 await nextTick ( )
520596 expectCalledTimesToBe ( 'Update every 10th row' , 0 , 0 , length ( ) / 10 , 0 )
521597
598+ // Replace a row with the same key
599+ list . value [ 0 ] = {
600+ id : list . value [ 0 ] . id ,
601+ label : list . value [ 0 ] . label + 10000 ,
602+ }
603+ await nextTick ( )
604+ expectCalledTimesToBe ( 'Replace a row with the same key' , 1 , 0 , 1 , 0 )
605+
522606 // Append rows
523607 list . value . push ( ...createItems ( 100 ) )
524608 await nextTick ( )
@@ -638,6 +722,15 @@ describe('createFor', () => {
638722 await nextTick ( )
639723 expectCalledTimesToBe ( 'Update every 10th row' , 0 , 0 , length ( ) / 10 , 0 )
640724
725+ // Replace a row with the same key
726+ list . value [ 0 ] = {
727+ id : list . value [ 0 ] . id ,
728+ label : shallowRef ( list . value [ 0 ] . label . value + 10000 ) ,
729+ }
730+ triggerRef ( list )
731+ await nextTick ( )
732+ expectCalledTimesToBe ( 'Replace a row with the same key' , 1 , 0 , 1 , 0 )
733+
641734 // Append rows
642735 list . value . push ( ...createItems ( 100 ) )
643736 triggerRef ( list )
0 commit comments