简单的表格:
将分类中相同的值合并效果如下:
静态数据合并单元格
实现:
- 将要合并列的第一列(index 为 0) 的 rowSpan 设置为 2。index 为 1(第二列) 的 rowSpan 设置为 0。
- 将 index 为 2 (第三列)的 rowSpan 设置为 1(可以不用设置 rowSpan,默认为1)。
- 将 index 为 3 (第四列)的 rowSpan 设置为 3,后面列(5和6列)的 rowSpan 设置为 0。
const columns = [
{
title: '分类',
dataIndex: 'category',
render: (value, row, index) => {
const obj = {
children: value,
props: {},
};
if (index === 0) { // 第一列
obj.props.rowSpan = 2;
}
if (index === 1) { // 第二列
obj.props.rowSpan = 0;
}
//没有相同项时可以不用设置 colSpan
if (index === 2) { // 第三列
obj.props.rowSpan = 1;
}
if (index === 3) { // 第四列
obj.props.rowSpan = 3;
}
if (index === 4) { // 第五列
obj.props.rowSpan = 0;
}
if (index === 5) { // 第六列
obj.props.rowSpan = 0;
}
return obj;
}
},
{
title: '名称',
dataIndex: 'name',
},
{
title: '评价',
dataIndex: 'desc',
},
];
const data = [
{
"category":"水果",
"name": "桃子",
"desc": "好吃"
},{
"category":"水果",
"name": "梨子",
"desc": "真好吃"
},{
"category":"蔬菜",
"name": "茄子",
"desc": "真TM好吃"
},{
"category":"家禽",
"name": "牛肉",
"desc": "太好吃了"
},{
"category":"家禽",
"name": "羊肉",
"desc": "好吃到停不下来"
},{
"category":"家禽",
"name": "猪肉",
"desc": "吃不起,太贵"
}
]
总结:
- 设置合并列的第一列 rowSpan 为合并数。
- 设置其他相同项 rowSpan 为 0。
动态数据合并单元格
可以先把数据源处理好再直接渲染页面,处理这种业务逻辑最好的方式就是直接处理数据状态,用数据状态代替业务逻辑。
import dataJson from './data/Table.json';
let data = dataJson.data;
let field = 'category';
const changeData = (data,field)=>{
let count = 0; // 重复项的第一项
let indexCount = 1; // 下一项
while (indexCount<data.length){
var item = data.slice(count,count+1)[0]; // 获取没有比较的第一个对象
if(!item.rowSpan){
item.rowSpan = 1; // 初始化为1 合并单元格
}
if(item[field] === data[indexCount][field]){// 第一个对象与后面的对象相比,有相同项就累加,并且后面相同项设置为0
item.rowSpan++;
data[indexCount].rowSpan = 0; // 其他为0
}else {
count = indexCount;
}
indexCount++;
}
}
changeData(data,field); // 处理数据
将每个相同项的第一项的 rowSpan 设置为合并数。并且其他的相同项设置为 0。数据格式如下:
data = [
{
"category":"水果",
"name": "桃子",
"desc": "好吃",
"rowSpan":2
},{
"category":"水果",
"name": "梨子",
"desc": "真好吃",
"rowSpan":0
},{
"category":"蔬菜",
"name": "茄子",
"desc": "真TM好吃",
"rowSpan":1
},{
"category":"家禽",
"name": "牛肉",
"desc": "太好吃了",
"rowSpan":3
},{
"category":"家禽",
"name": "羊肉",
"desc": "真不错",
"rowSpan":0
},{
"category":"家禽",
"name": "猪肉",
"desc": "吃不起,太贵",
"rowSpan":0
}
]