@@ -17,6 +17,7 @@ import {
1717 serializeInner as inner ,
1818 nextTick ,
1919 nodeOps ,
20+ onBeforeMount ,
2021 onBeforeUnmount ,
2122 onUnmounted ,
2223 openBlock ,
@@ -1199,7 +1200,7 @@ describe('renderer: optimized mode', () => {
11991200 createBlock ( 'div' , null , [
12001201 createVNode ( 'div' , null , [
12011202 cache [ 0 ] ||
1202- ( setBlockTracking ( - 1 ) ,
1203+ ( setBlockTracking ( - 1 , true ) ,
12031204 ( ( cache [ 0 ] = createVNode ( 'div' , null , [
12041205 createVNode ( Child ) ,
12051206 ] ) ) . cacheIndex = 0 ) ,
@@ -1233,4 +1234,64 @@ describe('renderer: optimized mode', () => {
12331234 expect ( inner ( root ) ) . toBe ( '<!--v-if-->' )
12341235 expect ( spyUnmounted ) . toHaveBeenCalledTimes ( 2 )
12351236 } )
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+ } )
12361297} )
0 commit comments