@@ -861,6 +861,114 @@ describe('renderer: optimized mode', () => {
861
861
expect ( inner ( root ) ) . toBe ( '<div><div>true</div></div>' )
862
862
} )
863
863
864
+ // #13305
865
+ test ( 'patch Suspense nested in list nodes in optimized mode' , async ( ) => {
866
+ const deps : Promise < any > [ ] = [ ]
867
+
868
+ const Item = {
869
+ props : {
870
+ someId : { type : Number , required : true } ,
871
+ } ,
872
+ async setup ( props : any ) {
873
+ const p = new Promise ( resolve => setTimeout ( resolve , 1 ) )
874
+ deps . push ( p )
875
+
876
+ await p
877
+ return ( ) => (
878
+ openBlock ( ) ,
879
+ createElementBlock ( 'li' , null , [
880
+ createElementVNode (
881
+ 'p' ,
882
+ null ,
883
+ String ( props . someId ) ,
884
+ PatchFlags . TEXT ,
885
+ ) ,
886
+ ] )
887
+ )
888
+ } ,
889
+ }
890
+
891
+ const list = ref ( [ 1 , 2 , 3 ] )
892
+ const App = {
893
+ setup ( ) {
894
+ return ( ) => (
895
+ openBlock ( ) ,
896
+ createElementBlock (
897
+ Fragment ,
898
+ null ,
899
+ [
900
+ createElementVNode (
901
+ 'p' ,
902
+ null ,
903
+ JSON . stringify ( list . value ) ,
904
+ PatchFlags . TEXT ,
905
+ ) ,
906
+ createElementVNode ( 'ol' , null , [
907
+ ( openBlock ( ) ,
908
+ createBlock ( SuspenseImpl , null , {
909
+ fallback : withCtx ( ( ) => [
910
+ createElementVNode ( 'li' , null , 'Loading…' ) ,
911
+ ] ) ,
912
+ default : withCtx ( ( ) => [
913
+ ( openBlock ( true ) ,
914
+ createElementBlock (
915
+ Fragment ,
916
+ null ,
917
+ renderList ( list . value , id => {
918
+ return (
919
+ openBlock ( ) ,
920
+ createBlock (
921
+ Item ,
922
+ {
923
+ key : id ,
924
+ 'some-id' : id ,
925
+ } ,
926
+ null ,
927
+ PatchFlags . PROPS ,
928
+ [ 'some-id' ] ,
929
+ )
930
+ )
931
+ } ) ,
932
+ PatchFlags . KEYED_FRAGMENT ,
933
+ ) ) ,
934
+ ] ) ,
935
+ _ : 1 /* STABLE */ ,
936
+ } ) ) ,
937
+ ] ) ,
938
+ ] ,
939
+ PatchFlags . STABLE_FRAGMENT ,
940
+ )
941
+ )
942
+ } ,
943
+ }
944
+
945
+ const app = createApp ( App )
946
+ app . mount ( root )
947
+ expect ( inner ( root ) ) . toBe ( `<p>[1,2,3]</p>` + `<ol><li>Loading…</li></ol>` )
948
+
949
+ await Promise . all ( deps )
950
+ await nextTick ( )
951
+ expect ( inner ( root ) ) . toBe (
952
+ `<p>[1,2,3]</p>` +
953
+ `<ol>` +
954
+ `<li><p>1</p></li>` +
955
+ `<li><p>2</p></li>` +
956
+ `<li><p>3</p></li>` +
957
+ `</ol>` ,
958
+ )
959
+
960
+ list . value = [ 3 , 1 , 2 ]
961
+ await nextTick ( )
962
+ expect ( inner ( root ) ) . toBe (
963
+ `<p>[3,1,2]</p>` +
964
+ `<ol>` +
965
+ `<li><p>3</p></li>` +
966
+ `<li><p>1</p></li>` +
967
+ `<li><p>2</p></li>` +
968
+ `</ol>` ,
969
+ )
970
+ } )
971
+
864
972
// #4183
865
973
test ( 'should not take unmount children fast path /w Suspense' , async ( ) => {
866
974
const show = ref ( true )
0 commit comments