1 回复
在uni-app中,使用<table>
标签配合v-for
指令来渲染表格数据,并实现单元格合并,可以通过自定义渲染逻辑和样式来实现。由于HTML原生<table>
标签在uni-app中并不完全支持复杂的合并单元格操作,我们通常使用CSS样式和自定义组件来模拟这种行为。
下面是一个简化的例子,演示如何在uni-app中使用v-for
渲染表格,并通过CSS和计算属性来模拟合并单元格:
<template>
<view class="container">
<view class="table">
<view class="thead">
<view class="tr">
<view class="th">#</view>
<view class="th">Name</view>
<view class="th">Age</view>
</view>
</view>
<view class="tbody">
<view v-for="(row, rowIndex) in formattedData" :key="rowIndex" class="tr">
<view class="td" :style="{ rowSpan: row.rowSpan }">{{ rowIndex + 1 }}</view>
<view class="td" :style="{ borderLeft: rowIndex === 0 ? '1px solid #000' : 'none' }">{{ row.name }}</view>
<view class="td">{{ row.age }}</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
data: [
{ name: 'Alice', age: 25 },
{ name: 'Bob', age: 30, merge: true }, // Merge with the next row
{ name: 'Charlie', age: 35 },
{ name: 'David', age: 40, merge: true },
{ name: 'Eve', age: 45 }
]
};
},
computed: {
formattedData() {
let result = [];
this.data.forEach((item, index) => {
if (item.merge && index < this.data.length - 1) {
result.push({ ...item, rowSpan: 2, name: `${item.name} + Next` });
result.push({ ...this.data[index + 1], rowSpan: 0, name: '' });
index++; // Skip the next item as it's already merged
} else {
result.push({ ...item, rowSpan: 1 });
}
});
return result;
}
}
};
</script>
<style>
.container {
padding: 16px;
}
.table {
width: 100%;
border-collapse: collapse;
}
.th, .td {
border: 1px solid #000;
padding: 8px;
text-align: left;
}
.tr {
display: flex;
}
</style>
注意:
- 示例中的
formattedData
计算属性用于处理合并单元格的逻辑,根据merge
字段动态调整rowSpan
。 - 由于uni-app的视图层限制,这里通过CSS样式模拟了表格边框和单元格合并效果。
- 实际应用中可能需要更复杂的逻辑来处理不同方向的单元格合并(如列合并),这通常涉及到更多的计算和对DOM结构的调整。