@@ -1123,6 +1123,73 @@ describe('Vapor Mode hydration', () => {
1123
1123
} )
1124
1124
} )
1125
1125
1126
+ test ( 'on fragment component' , async ( ) => {
1127
+ runWithEnv ( isProd , async ( ) => {
1128
+ const data = ref ( true )
1129
+ const { container } = await testHydration (
1130
+ `<template>
1131
+ <div>
1132
+ <components.Child v-if="data"/>
1133
+ </div>
1134
+ </template>` ,
1135
+ {
1136
+ Child : `<template><div>{{ data }}</div>-{{ data }}-</template>` ,
1137
+ } ,
1138
+ data ,
1139
+ )
1140
+ expect ( container . innerHTML ) . toBe (
1141
+ `<div>` +
1142
+ `<!--[--><div>true</div>-true-<!--]-->` +
1143
+ `<!--if-->` +
1144
+ `</div>` ,
1145
+ )
1146
+
1147
+ data . value = false
1148
+ await nextTick ( )
1149
+ expect ( container . innerHTML ) . toBe (
1150
+ `<div>` + `<!--[--><!--]-->` + `<!--${ anchorLabel } -->` + `</div>` ,
1151
+ )
1152
+ } )
1153
+ } )
1154
+
1155
+ test ( 'on fragment component with anchor insertion' , async ( ) => {
1156
+ runWithEnv ( isProd , async ( ) => {
1157
+ const data = ref ( true )
1158
+ const { container } = await testHydration (
1159
+ `<template>
1160
+ <div>
1161
+ <span/>
1162
+ <components.Child v-if="data"/>
1163
+ <span/>
1164
+ </div>
1165
+ </template>` ,
1166
+ {
1167
+ Child : `<template><div>{{ data }}</div>-{{ data }}-</template>` ,
1168
+ } ,
1169
+ data ,
1170
+ )
1171
+ expect ( container . innerHTML ) . toBe (
1172
+ `<div>` +
1173
+ `<span></span>` +
1174
+ `<!--[--><div>true</div>-true-<!--]-->` +
1175
+ `<!--if-->` +
1176
+ `<span></span>` +
1177
+ `</div>` ,
1178
+ )
1179
+
1180
+ data . value = false
1181
+ await nextTick ( )
1182
+ expect ( container . innerHTML ) . toBe (
1183
+ `<div>` +
1184
+ `<span></span>` +
1185
+ `<!--[--><!--]-->` +
1186
+ `<!--${ anchorLabel } -->` +
1187
+ `<span></span>` +
1188
+ `</div>` ,
1189
+ )
1190
+ } )
1191
+ } )
1192
+
1126
1193
test ( 'consecutive v-if on fragment component with anchor insertion' , async ( ) => {
1127
1194
runWithEnv ( isProd , async ( ) => {
1128
1195
const data = ref ( true )
@@ -1311,7 +1378,168 @@ describe('Vapor Mode hydration', () => {
1311
1378
}
1312
1379
} )
1313
1380
1314
- test . todo ( 'for' )
1381
+ describe ( 'for' , ( ) => {
1382
+ test ( 'basic v-for' , async ( ) => {
1383
+ const { container, data } = await testHydration (
1384
+ `<template>
1385
+ <div>
1386
+ <span v-for="item in data" :key="item">{{ item }}</span>
1387
+ </div>
1388
+ </template>` ,
1389
+ undefined ,
1390
+ ref ( [ 'a' , 'b' , 'c' ] ) ,
1391
+ )
1392
+ expect ( container . innerHTML ) . toBe (
1393
+ `<div>` +
1394
+ `<!--[-->` +
1395
+ `<span>a</span>` +
1396
+ `<span>b</span>` +
1397
+ `<span>c</span>` +
1398
+ `<!--]-->` +
1399
+ `</div>` ,
1400
+ )
1401
+
1402
+ data . value . push ( 'd' )
1403
+ await nextTick ( )
1404
+ expect ( container . innerHTML ) . toBe (
1405
+ `<div>` +
1406
+ `<!--[-->` +
1407
+ `<span>a</span>` +
1408
+ `<span>b</span>` +
1409
+ `<span>c</span>` +
1410
+ `<span>d</span>` +
1411
+ `<!--]-->` +
1412
+ `</div>` ,
1413
+ )
1414
+ } )
1415
+
1416
+ test ( 'v-for with text node' , async ( ) => {
1417
+ const { container, data } = await testHydration (
1418
+ `<template>
1419
+ <div>
1420
+ <span v-for="item in data" :key="item">{{ item }}</span>
1421
+ </div>
1422
+ </template>` ,
1423
+ undefined ,
1424
+ ref ( [ 'a' , 'b' , 'c' ] ) ,
1425
+ )
1426
+ expect ( container . innerHTML ) . toBe (
1427
+ `<div><!--[--><span>a</span><span>b</span><span>c</span><!--]--></div>` ,
1428
+ )
1429
+
1430
+ data . value . push ( 'd' )
1431
+ await nextTick ( )
1432
+ expect ( container . innerHTML ) . toBe (
1433
+ `<div><!--[--><span>a</span><span>b</span><span>c</span><span>d</span><!--]--></div>` ,
1434
+ )
1435
+ } )
1436
+
1437
+ test ( 'v-for with anchor insertion' , async ( ) => {
1438
+ const { container, data } = await testHydration (
1439
+ `<template>
1440
+ <div>
1441
+ <span/>
1442
+ <span v-for="item in data" :key="item">{{ item }}</span>
1443
+ <span/>
1444
+ </div>
1445
+ </template>` ,
1446
+ undefined ,
1447
+ ref ( [ 'a' , 'b' , 'c' ] ) ,
1448
+ )
1449
+ expect ( container . innerHTML ) . toBe (
1450
+ `<div>` +
1451
+ `<span></span>` +
1452
+ `<!--[-->` +
1453
+ `<span>a</span>` +
1454
+ `<span>b</span>` +
1455
+ `<span>c</span>` +
1456
+ `<!--]-->` +
1457
+ `<span></span>` +
1458
+ `</div>` ,
1459
+ )
1460
+
1461
+ data . value . push ( 'd' )
1462
+ await nextTick ( )
1463
+ expect ( container . innerHTML ) . toBe (
1464
+ `<div>` +
1465
+ `<span></span>` +
1466
+ `<!--[-->` +
1467
+ `<span>a</span>` +
1468
+ `<span>b</span>` +
1469
+ `<span>c</span>` +
1470
+ `<span>d</span>` +
1471
+ `<!--]-->` +
1472
+ `<span></span>` +
1473
+ `</div>` ,
1474
+ )
1475
+ } )
1476
+
1477
+ test ( 'consecutive v-for with anchor insertion' , async ( ) => {
1478
+ const { container, data } = await testHydration (
1479
+ `<template>
1480
+ <div>
1481
+ <span/>
1482
+ <span v-for="item in data" :key="item">{{ item }}</span>
1483
+ <span v-for="item in data" :key="item">{{ item }}</span>
1484
+ <span/>
1485
+ </div>
1486
+ </template>` ,
1487
+ undefined ,
1488
+ ref ( [ 'a' , 'b' , 'c' ] ) ,
1489
+ )
1490
+ expect ( container . innerHTML ) . toBe (
1491
+ `<div>` +
1492
+ `<span></span>` +
1493
+ `<!--[-->` +
1494
+ `<span>a</span>` +
1495
+ `<span>b</span>` +
1496
+ `<span>c</span>` +
1497
+ `<!--]-->` +
1498
+ `<!--[[-->` +
1499
+ `<!--[-->` +
1500
+ `<span>a</span>` +
1501
+ `<span>b</span>` +
1502
+ `<span>c</span>` +
1503
+ `<!--]-->` +
1504
+ `<!--]]-->` +
1505
+ `<span></span>` +
1506
+ `</div>` ,
1507
+ )
1508
+
1509
+ data . value . push ( 'd' )
1510
+ await nextTick ( )
1511
+ expect ( container . innerHTML ) . toBe (
1512
+ `<div>` +
1513
+ `<span></span>` +
1514
+ `<!--[-->` +
1515
+ `<span>a</span>` +
1516
+ `<span>b</span>` +
1517
+ `<span>c</span>` +
1518
+ `<span>d</span>` +
1519
+ `<!--]-->` +
1520
+ `<!--[[-->` +
1521
+ `<!--[-->` +
1522
+ `<span>a</span>` +
1523
+ `<span>b</span>` +
1524
+ `<span>c</span>` +
1525
+ `<span>d</span>` +
1526
+ `<!--]-->` +
1527
+ `<!--]]-->` +
1528
+ `<span></span>` +
1529
+ `</div>` ,
1530
+ )
1531
+ } )
1532
+
1533
+ // TODO wait for slots hydration support
1534
+ test . todo ( 'v-for on component' , async ( ) => { } )
1535
+
1536
+ // TODO wait for slots hydration support
1537
+ test . todo ( 'on fragment component' , async ( ) => { } )
1538
+
1539
+ // TODO wait for vapor TransitionGroup support
1540
+ // v-for inside TransitionGroup does not render as a fragment
1541
+ test . todo ( 'v-for in TransitionGroup' , async ( ) => { } )
1542
+ } )
1315
1543
1316
1544
test . todo ( 'slots' )
1317
1545
0 commit comments