@@ -17,6 +17,7 @@ import {
17
17
serializeInner as inner ,
18
18
nextTick ,
19
19
nodeOps ,
20
+ onBeforeMount ,
20
21
onBeforeUnmount ,
21
22
onUnmounted ,
22
23
openBlock ,
@@ -1199,7 +1200,7 @@ describe('renderer: optimized mode', () => {
1199
1200
createBlock ( 'div' , null , [
1200
1201
createVNode ( 'div' , null , [
1201
1202
cache [ 0 ] ||
1202
- ( setBlockTracking ( - 1 ) ,
1203
+ ( setBlockTracking ( - 1 , true ) ,
1203
1204
( ( cache [ 0 ] = createVNode ( 'div' , null , [
1204
1205
createVNode ( Child ) ,
1205
1206
] ) ) . cacheIndex = 0 ) ,
@@ -1233,4 +1234,64 @@ describe('renderer: optimized mode', () => {
1233
1234
expect ( inner ( root ) ) . toBe ( '<!--v-if-->' )
1234
1235
expect ( spyUnmounted ) . toHaveBeenCalledTimes ( 2 )
1235
1236
} )
1237
+
1238
+ // #12371
1239
+ test ( 'unmount children when the user calls a compiled slot' , async ( ) => {
1240
+ const beforeMountSpy = vi . fn ( )
1241
+ const beforeUnmountSpy = vi . fn ( )
1242
+
1243
+ const Child = {
1244
+ setup ( ) {
1245
+ onBeforeMount ( beforeMountSpy )
1246
+ onBeforeUnmount ( beforeUnmountSpy )
1247
+ return ( ) => 'child'
1248
+ } ,
1249
+ }
1250
+
1251
+ const Wrapper = {
1252
+ setup ( _ : any , { slots } : SetupContext ) {
1253
+ return ( ) => (
1254
+ openBlock ( ) ,
1255
+ createElementBlock ( 'section' , null , [
1256
+ ( openBlock ( ) ,
1257
+ createElementBlock ( 'div' , { key : 1 } , [
1258
+ createTextVNode ( slots . header ! ( ) ? 'foo' : 'bar' , 1 /* TEXT */ ) ,
1259
+ renderSlot ( slots , 'content' ) ,
1260
+ ] ) ) ,
1261
+ ] )
1262
+ )
1263
+ } ,
1264
+ }
1265
+
1266
+ const show = ref ( false )
1267
+ const app = createApp ( {
1268
+ render ( ) {
1269
+ return show . value
1270
+ ? ( openBlock ( ) ,
1271
+ createBlock ( Wrapper , null , {
1272
+ header : withCtx ( ( ) => [ createVNode ( { } ) ] ) ,
1273
+ content : withCtx ( ( ) => [ createVNode ( Child ) ] ) ,
1274
+ _ : 1 ,
1275
+ } ) )
1276
+ : createCommentVNode ( 'v-if' , true )
1277
+ } ,
1278
+ } )
1279
+
1280
+ app . mount ( root )
1281
+ expect ( inner ( root ) ) . toMatchInlineSnapshot ( `"<!--v-if-->"` )
1282
+ expect ( beforeMountSpy ) . toHaveBeenCalledTimes ( 0 )
1283
+ expect ( beforeUnmountSpy ) . toHaveBeenCalledTimes ( 0 )
1284
+
1285
+ show . value = true
1286
+ await nextTick ( )
1287
+ expect ( inner ( root ) ) . toMatchInlineSnapshot (
1288
+ `"<section><div>foochild</div></section>"` ,
1289
+ )
1290
+ expect ( beforeMountSpy ) . toHaveBeenCalledTimes ( 1 )
1291
+
1292
+ show . value = false
1293
+ await nextTick ( )
1294
+ expect ( inner ( root ) ) . toBe ( '<!--v-if-->' )
1295
+ expect ( beforeUnmountSpy ) . toHaveBeenCalledTimes ( 1 )
1296
+ } )
1236
1297
} )
0 commit comments