@@ -54,6 +54,18 @@ describe('Suspense', () => {
54
54
}
55
55
}
56
56
57
+ const RouterView = {
58
+ setup ( _ : any , { slots } : any ) {
59
+ const route = inject ( 'route' ) as any
60
+ const depth = inject ( 'depth' , 0 )
61
+ provide ( 'depth' , depth + 1 )
62
+ return ( ) => {
63
+ const current = route . value [ depth ]
64
+ return slots . default ( { Component : current } ) [ 0 ]
65
+ }
66
+ } ,
67
+ }
68
+
57
69
test ( 'fallback content' , async ( ) => {
58
70
const Async = defineAsyncComponent ( {
59
71
render ( ) {
@@ -1041,18 +1053,6 @@ describe('Suspense', () => {
1041
1053
1042
1054
// #10098
1043
1055
test ( 'switching branches w/ nested suspense' , async ( ) => {
1044
- const RouterView = {
1045
- setup ( _ : any , { slots } : any ) {
1046
- const route = inject ( 'route' ) as any
1047
- const depth = inject ( 'depth' , 0 )
1048
- provide ( 'depth' , depth + 1 )
1049
- return ( ) => {
1050
- const current = route . value [ depth ]
1051
- return slots . default ( { Component : current } ) [ 0 ]
1052
- }
1053
- } ,
1054
- }
1055
-
1056
1056
const OuterB = defineAsyncComponent ( {
1057
1057
setup : ( ) => {
1058
1058
return ( ) =>
@@ -1132,6 +1132,121 @@ describe('Suspense', () => {
1132
1132
expect ( serializeInner ( root ) ) . toBe ( `<div>innerA</div>` )
1133
1133
} )
1134
1134
1135
+ // #10415
1136
+ test ( 'nested suspense (w/ suspensible) switch several times before parent suspense resolve' , async ( ) => {
1137
+ const OuterA = defineAsyncComponent ( {
1138
+ setup : ( ) => {
1139
+ return ( ) =>
1140
+ h ( RouterView , null , {
1141
+ default : ( { Component } : any ) => [
1142
+ h ( Suspense , null , {
1143
+ default : ( ) => h ( Component ) ,
1144
+ } ) ,
1145
+ ] ,
1146
+ } )
1147
+ } ,
1148
+ } )
1149
+
1150
+ const InnerA = defineAsyncComponent ( {
1151
+ setup : ( ) => {
1152
+ return ( ) => h ( 'div' , 'innerA' )
1153
+ } ,
1154
+ } )
1155
+
1156
+ const route = shallowRef ( [ OuterA , InnerA ] )
1157
+ const InnerB = defineAsyncComponent (
1158
+ {
1159
+ setup : ( ) => {
1160
+ return ( ) => h ( 'div' , 'innerB' )
1161
+ } ,
1162
+ } ,
1163
+ 5 ,
1164
+ )
1165
+
1166
+ const InnerB1 = defineAsyncComponent (
1167
+ {
1168
+ setup : ( ) => {
1169
+ return ( ) => h ( 'div' , 'innerB1' )
1170
+ } ,
1171
+ } ,
1172
+ 5 ,
1173
+ )
1174
+
1175
+ const InnerB2 = defineAsyncComponent (
1176
+ {
1177
+ setup : ( ) => {
1178
+ return ( ) => h ( 'div' , 'innerB2' )
1179
+ } ,
1180
+ } ,
1181
+ 5 ,
1182
+ )
1183
+
1184
+ const OuterB = defineAsyncComponent (
1185
+ {
1186
+ setup ( ) {
1187
+ nextTick ( async ( ) => {
1188
+ await new Promise ( resolve => setTimeout ( resolve , 1 ) )
1189
+ route . value = [ OuterB , InnerB1 ]
1190
+ } )
1191
+
1192
+ nextTick ( async ( ) => {
1193
+ await new Promise ( resolve => setTimeout ( resolve , 1 ) )
1194
+ route . value = [ OuterB , InnerB2 ]
1195
+ } )
1196
+
1197
+ return ( ) =>
1198
+ h ( RouterView , null , {
1199
+ default : ( { Component } : any ) => [
1200
+ h (
1201
+ Suspense ,
1202
+ { suspensible : true } ,
1203
+ {
1204
+ default : ( ) => h ( Component ) ,
1205
+ } ,
1206
+ ) ,
1207
+ ] ,
1208
+ } )
1209
+ } ,
1210
+ } ,
1211
+ 5 ,
1212
+ )
1213
+
1214
+ const Comp = {
1215
+ setup ( ) {
1216
+ provide ( 'route' , route )
1217
+ return ( ) =>
1218
+ h ( RouterView , null , {
1219
+ default : ( { Component } : any ) => [
1220
+ h ( Suspense , null , {
1221
+ default : ( ) => h ( Component ) ,
1222
+ } ) ,
1223
+ ] ,
1224
+ } )
1225
+ } ,
1226
+ }
1227
+
1228
+ const root = nodeOps . createElement ( 'div' )
1229
+ render ( h ( Comp ) , root )
1230
+ await Promise . all ( deps )
1231
+ await nextTick ( )
1232
+ expect ( serializeInner ( root ) ) . toBe ( `<!---->` )
1233
+
1234
+ await Promise . all ( deps )
1235
+ await nextTick ( )
1236
+ expect ( serializeInner ( root ) ) . toBe ( `<div>innerA</div>` )
1237
+
1238
+ deps . length = 0
1239
+
1240
+ route . value = [ OuterB , InnerB ]
1241
+ await nextTick ( )
1242
+
1243
+ await Promise . all ( deps )
1244
+ await Promise . all ( deps )
1245
+ await Promise . all ( deps )
1246
+ await nextTick ( )
1247
+ expect ( serializeInner ( root ) ) . toBe ( `<div>innerB2</div>` )
1248
+ } )
1249
+
1135
1250
test ( 'branch switch to 3rd branch before resolve' , async ( ) => {
1136
1251
const calls : string [ ] = [ ]
1137
1252
0 commit comments