@@ -22,7 +22,7 @@ import {
22
22
watch ,
23
23
watchEffect ,
24
24
} from '@vue/runtime-test'
25
- import { createApp , defineComponent } from 'vue'
25
+ import { computed , createApp , defineComponent , inject , provide } from 'vue'
26
26
import type { RawSlots } from 'packages/runtime-core/src/componentSlots'
27
27
import { resetSuspenseId } from '../../src/components/Suspense'
28
28
@@ -1039,6 +1039,99 @@ describe('Suspense', () => {
1039
1039
expect ( serializeInner ( root ) ) . toBe ( `<div>foo<div>foo nested</div></div>` )
1040
1040
} )
1041
1041
1042
+ // #10098
1043
+ 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
+ const OuterB = defineAsyncComponent ( {
1057
+ setup : ( ) => {
1058
+ return ( ) =>
1059
+ h ( RouterView , null , {
1060
+ default : ( { Component } : any ) => [
1061
+ h ( Suspense , null , {
1062
+ default : ( ) => h ( Component ) ,
1063
+ } ) ,
1064
+ ] ,
1065
+ } )
1066
+ } ,
1067
+ } )
1068
+
1069
+ const InnerB = defineAsyncComponent ( {
1070
+ setup : ( ) => {
1071
+ return ( ) => h ( 'div' , 'innerB' )
1072
+ } ,
1073
+ } )
1074
+
1075
+ const OuterA = defineAsyncComponent ( {
1076
+ setup : ( ) => {
1077
+ return ( ) =>
1078
+ h ( RouterView , null , {
1079
+ default : ( { Component } : any ) => [
1080
+ h ( Suspense , null , {
1081
+ default : ( ) => h ( Component ) ,
1082
+ } ) ,
1083
+ ] ,
1084
+ } )
1085
+ } ,
1086
+ } )
1087
+
1088
+ const InnerA = defineAsyncComponent ( {
1089
+ setup : ( ) => {
1090
+ return ( ) => h ( 'div' , 'innerA' )
1091
+ } ,
1092
+ } )
1093
+
1094
+ const toggle = ref ( true )
1095
+ const route = computed ( ( ) => {
1096
+ return toggle . value ? [ OuterA , InnerA ] : [ OuterB , InnerB ]
1097
+ } )
1098
+
1099
+ const Comp = {
1100
+ setup ( ) {
1101
+ provide ( 'route' , route )
1102
+ return ( ) =>
1103
+ h ( RouterView , null , {
1104
+ default : ( { Component } : any ) => [
1105
+ h ( Suspense , null , {
1106
+ default : ( ) => h ( Component ) ,
1107
+ } ) ,
1108
+ ] ,
1109
+ } )
1110
+ } ,
1111
+ }
1112
+
1113
+ const root = nodeOps . createElement ( 'div' )
1114
+ render ( h ( Comp ) , root )
1115
+ await Promise . all ( deps )
1116
+ await nextTick ( )
1117
+ expect ( serializeInner ( root ) ) . toBe ( `<!---->` )
1118
+
1119
+ await Promise . all ( deps )
1120
+ await nextTick ( )
1121
+ expect ( serializeInner ( root ) ) . toBe ( `<div>innerA</div>` )
1122
+
1123
+ deps . length = 0
1124
+
1125
+ toggle . value = false
1126
+ await nextTick ( )
1127
+ // toggle again
1128
+ toggle . value = true
1129
+
1130
+ await Promise . all ( deps )
1131
+ await nextTick ( )
1132
+ expect ( serializeInner ( root ) ) . toBe ( `<div>innerA</div>` )
1133
+ } )
1134
+
1042
1135
test ( 'branch switch to 3rd branch before resolve' , async ( ) => {
1043
1136
const calls : string [ ] = [ ]
1044
1137
0 commit comments