问题:
整个table是在vue中通过v-for生成的,目前出现的问题是当某一个tr中所有的td元素的rowspan属性均大于1时,就会发生错位, 类似如下情况
-返回数据中包含rowspan等值)
原因、解决:
因为rowspan是用来占行的,如果一行里全部td的 rows 都为2 则意味着 下一tr 里应该是没有 td 元素的 但是实际上 下一tr 又有td,所以这行的td没有容身之处,被挤到右边去了。
解决思路是除了第一项被合并的那一列 rowspan设置合并单元格的长度,剩余的rowspan设置空, 再用v-if过滤掉rowspan为空的项
HTML
<table border="1px" border-color="#ccc" cellspacing="0" class="margin-b5">
<thead>
<tr>
<th align="center" width="42%">收费项目</th>
<th align="center">支付渠道</th>
<th align="center">服务费</th>
<th align="center">金融手续费</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in tableData" :key="index">
<td v-if="item.rowspan" :rowspan="item.rowspan">{{ item.item_name }}</td>
<td rowspan="1" align="center">{{ item.pay_channel_name }}</td>
<td rowspan="1" class="c-item-red">{{ item.server_charge }}</td>
<td rowspan="1" class="c-item-red">{{ item.pay_rate }}</td>
</tr>
</tbody>
</table>
JS
import { groupBy } from 'lodash'
const grouped = groupBy(temData.platServiceChargeList, v => v.item_type)
// 其次合并,第一项占行,后续为0
const result = Object.keys(grouped)
.map(k => grouped[k].map((v, i, arr) => ({ ...v, rowspan: i === 0 ? arr.length : arr.length > 1 ? '' : 1 })))
.flatMap(v => v)
this.tableData = result
修改后