@@ -1340,6 +1340,98 @@ describe('e2e: Transition', () => {
1340
1340
E2E_TIMEOUT ,
1341
1341
)
1342
1342
1343
+ // #11061
1344
+ test (
1345
+ 'transition + fallthrough attrs (in-out mode)' ,
1346
+ async ( ) => {
1347
+ const beforeLeaveSpy = vi . fn ( )
1348
+ const onLeaveSpy = vi . fn ( )
1349
+ const afterLeaveSpy = vi . fn ( )
1350
+ const beforeEnterSpy = vi . fn ( )
1351
+ const onEnterSpy = vi . fn ( )
1352
+ const afterEnterSpy = vi . fn ( )
1353
+
1354
+ await page ( ) . exposeFunction ( 'onLeaveSpy' , onLeaveSpy )
1355
+ await page ( ) . exposeFunction ( 'onEnterSpy' , onEnterSpy )
1356
+ await page ( ) . exposeFunction ( 'beforeLeaveSpy' , beforeLeaveSpy )
1357
+ await page ( ) . exposeFunction ( 'beforeEnterSpy' , beforeEnterSpy )
1358
+ await page ( ) . exposeFunction ( 'afterLeaveSpy' , afterLeaveSpy )
1359
+ await page ( ) . exposeFunction ( 'afterEnterSpy' , afterEnterSpy )
1360
+
1361
+ await page ( ) . evaluate ( ( ) => {
1362
+ const { onEnterSpy, onLeaveSpy } = window as any
1363
+ const { createApp, ref } = ( window as any ) . Vue
1364
+ createApp ( {
1365
+ components : {
1366
+ one : {
1367
+ template : '<div>one</div>' ,
1368
+ } ,
1369
+ two : {
1370
+ template : '<div>two</div>' ,
1371
+ } ,
1372
+ } ,
1373
+ template : `
1374
+ <div id="container">
1375
+ <transition foo="1" name="test" mode="in-out"
1376
+ @before-enter="beforeEnterSpy()"
1377
+ @enter="onEnterSpy()"
1378
+ @after-enter="afterEnterSpy()"
1379
+ @before-leave="beforeLeaveSpy()"
1380
+ @leave="onLeaveSpy()"
1381
+ @after-leave="afterLeaveSpy()">
1382
+ <component :is="view"></component>
1383
+ </transition>
1384
+ </div>
1385
+ <button id="toggleBtn" @click="click">button</button>
1386
+ ` ,
1387
+ setup : ( ) => {
1388
+ const view = ref ( 'one' )
1389
+ const click = ( ) =>
1390
+ ( view . value = view . value === 'one' ? 'two' : 'one' )
1391
+ return {
1392
+ view,
1393
+ click,
1394
+ beforeEnterSpy,
1395
+ onEnterSpy,
1396
+ afterEnterSpy,
1397
+ beforeLeaveSpy,
1398
+ onLeaveSpy,
1399
+ afterLeaveSpy,
1400
+ }
1401
+ } ,
1402
+ } ) . mount ( '#app' )
1403
+ } )
1404
+ expect ( await html ( '#container' ) ) . toBe ( '<div foo="1">one</div>' )
1405
+
1406
+ // toggle
1407
+ await click ( '#toggleBtn' )
1408
+ await nextTick ( )
1409
+ await transitionFinish ( )
1410
+ expect ( beforeEnterSpy ) . toBeCalledTimes ( 1 )
1411
+ expect ( onEnterSpy ) . toBeCalledTimes ( 1 )
1412
+ expect ( afterEnterSpy ) . toBeCalledTimes ( 1 )
1413
+ expect ( beforeLeaveSpy ) . toBeCalledTimes ( 1 )
1414
+ expect ( onLeaveSpy ) . toBeCalledTimes ( 1 )
1415
+ expect ( afterLeaveSpy ) . toBeCalledTimes ( 1 )
1416
+
1417
+ expect ( await html ( '#container' ) ) . toBe ( '<div foo="1" class="">two</div>' )
1418
+
1419
+ // toggle back
1420
+ await click ( '#toggleBtn' )
1421
+ await nextTick ( )
1422
+ await transitionFinish ( )
1423
+ expect ( beforeEnterSpy ) . toBeCalledTimes ( 2 )
1424
+ expect ( onEnterSpy ) . toBeCalledTimes ( 2 )
1425
+ expect ( afterEnterSpy ) . toBeCalledTimes ( 2 )
1426
+ expect ( beforeLeaveSpy ) . toBeCalledTimes ( 2 )
1427
+ expect ( onLeaveSpy ) . toBeCalledTimes ( 2 )
1428
+ expect ( afterLeaveSpy ) . toBeCalledTimes ( 2 )
1429
+
1430
+ expect ( await html ( '#container' ) ) . toBe ( '<div foo="1" class="">one</div>' )
1431
+ } ,
1432
+ E2E_TIMEOUT ,
1433
+ )
1434
+
1343
1435
test (
1344
1436
'w/ KeepAlive + unmount innerChild' ,
1345
1437
async ( ) => {
0 commit comments