如何利用iview的Table组件实现将表格的列合并
2个回答
展开全部
本篇文章给大家带来的内容是关于如何利用iview的Table组件实现将表格的列合并,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
iview的Table组件表头分组iview的Table组件表头分组
需求说明合并表头
合并列,展示[合计]
最终呈现的效果
问题表头有重复的key,数据如何匹配
实现合并列——需要修改Table组件来实现
1、合并表头根据iview提供的demo可以看出,表头的编辑是比较容易的,只需要根据格式编写即可。
问题:表头有重复的key,表头和表数据如何匹配
解决:
需要分组的表头 key_供货人ID
需要分组的表数据 key_供货人ID
[
{
"width":"200",
"align":"center",
"title":"物品名称",
"ellipsis":true,
"key":"name",
},
{
"width":"100",
"align":"center",
"title":"数量",
"ellipsis":true,
"key":"purchaseAmount",
},
{
"width":"166",
"align":"center",
"title":"lyy369",
"ellipsis":true,
"key":"supplier_11113173785",
"children":[
{
"width":"100",
"align":"center",
"title":"单价(元)",
"ellipsis":true,
"key":"quoteUnitPrice_11113173785",
},
{
"width":"100",
"align":"center",
"title":"总计(元)",
"ellipsis":true,
"key":"quoteTotalPrice_11113173785",
}
]
},
{
"width":"166",
"align":"center",
"title":"私人定制",
"ellipsis":true,
"key":"supplier_11113173838",
"children":[
{
"width":"100",
"align":"center",
"title":"单价(元)",
"ellipsis":true,
"key":"quoteUnitPrice_11113173838",
},
{
"width":"100",
"align":"center",
"title":"总计(元)",
"ellipsis":true,
"key":"quoteTotalPrice_11113173838",
}
]
}
][
{
"name":"手动添加",
"purchaseAmount":"9887.00",
"quoteTotalPrice_11113173785":"494350.00",
"supplierId_11113173785":"11113173785",
"quoteAmount_11113173785":"9887.0000",
"quoteUnitPrice_11113173785":"50.0000",
"quoteTotalPrice_11113173838":"988700.00",
"supplierId_11113173838":"11113173838",
"quoteAmount_11113173838":"9887.0000",
"quoteUnitPrice_11113173838":"100.0000"
},
{
"name":"2018年7月9日",
"purchaseAmount":"1.00",
"quoteTotalPrice_11113173785":"50.00",
"supplierId_11113173785":"11113173785",
"quoteAmount_11113173785":"1.0000",
"quoteUnitPrice_11113173785":"50.0000",
"quoteTotalPrice_11113173838":"100.00",
"supplierId_11113173838":"11113173838",
"quoteAmount_11113173838":"1.0000",
"quoteUnitPrice_11113173838":"100.0000"
},
{
"name":" 中国移动取消流量“漫游”费",
"purchaseAmount":"563.00",
"quoteTotalPrice_11113173785":"28150.00",
"supplierId_11113173785":"11113173785",
"quoteAmount_11113173785":"563.0000",
"quoteUnitPrice_11113173785":"50.0000"
},
{
"name":" 中国移动取消流量“漫游”费",
"purchaseAmount":"23.00",
"quoteTotalPrice_11113173785":"1150.00",
"supplierId_11113173785":"11113173785",
"quoteAmount_11113173785":"23.0000",
"quoteUnitPrice_11113173785":"50.0000",
"quoteTotalPrice_11113173838":"2300.00",
"supplierId_11113173838":"11113173838",
"quoteAmount_11113173838":"23.0000",
"quoteUnitPrice_11113173838":"100.0000"
}
]2、实现[合计]的合并列展示此处需要更改iview的Table组件的源码。
数据格式如下,控制行,控制列,控制合并个数,控制展示数据
[
{// 每一条,表示有一行
"total":"合计", // 展示的数据
"key":"total", // 表头的key
"align":"center",
"ellipsis":true,
"colspan":"2", // 需要计算合并列的个数
"tableBody":[ // tableBody.length 表示有多少个值
{
"total_11113173785":"523700.00",
"key":"total_11113173785",
"colspan":"2",
"align":"center",
"ellipsis":true
},
{
"total_11113173838":"991100.00",
"key":"total_11113173838",
"colspan":"2",
"align":"center",
"ellipsis":true
}
]
}
]以下是修改的源码,暂时不支持表格的鼠标移入等事件
table-body.vue:33<!-- ++++++++++++++++ 2018年8月7日16:49:00 合并列单元格 start +++++++++++++++++++++ -->
<template v-if="(index+1)==data.length">
<template v-for="(colSpanColumn, colSpanColumnIndex) in colSpanColumns">
<table-tr
:row="colSpanColumn"
:key="colSpanColumn.key"
:prefix-cls="prefixCls"
>
<td :colspan="colSpanColumn.colspan" :class="alignCls(colSpanColumn, colSpanColumn.tableBody)">
<Cell
:natural-index="Number(colSpanColumnIndex+data.length)"
:index="Number(colSpanColumnIndex+data.length)"
:prefix-cls="prefixCls"
:row="colSpanColumn"
:key="colSpanColumn.key"
:column="colSpanColumn"
></Cell>
</td>
<template v-for="(colSpanBody, colSpanBodyIndex) in colSpanColumn.tableBody" :class="alignCls(colSpanColumn, colSpanBody)">
<td :colspan="colSpanBody.colspan" :class="alignCls(colSpanBody, colSpanBody)">
<Cell
:natural-index="Number(colSpanBodyIndex+data.length)"
:index="Number(colSpanBodyIndex+data.length)"
:prefix-cls="prefixCls"
:row="colSpanBody"
:key="colSpanBody.key"
:column="colSpanBody"
></Cell>
</td>
</template>
</table-tr>
</template>
</template>
<!-- ++++++++++++++++ 合并列单元格 end +++++++++++++++++++++ -->
展开全部
要实现iview的Table组件中的列合并,您可以使用Table的自定义模板功能以及Colspan属性。
1. 为表格数据源添加字段用于表示要合并的列,例如"mergeKey"字段。
2. 在Table组件中,设置需要合并的列的render属性为一个自定义的模板方法。在该方法中,可以根据当前行的数据,判断是否需要进行列合并,并返回对应的合并信息。
```vue
<template>
<Table :data="tableData">
<Table-column prop="name" label="姓名"></Table-column>
<Table-column prop="age" label="年龄"></Table-column>
<Table-column prop="gender" label="性别"></Table-column>
<Table-column label="合并列" :render="customRender"></Table-column>
</Table>
</template>
<script>
export default {
data() {
return {
tableData: [
{ name: '张三', age: 20, gender: '男', mergeKey: '1' },
{ name: '李四', age: 25, gender: '女', mergeKey: '1' },
{ name: '王五', age: 30, gender: '男', mergeKey: '2' },
{ name: '赵六', age: 35, gender: '女', mergeKey: '2' }
]
};
},
methods: {
customRender(h, { row, column, $index }) {
if (row.mergeKey !== this.tableData[$index - 1]?.mergeKey) {
const rowspan = this.getRowspan(row, column.prop);
return {
children: row[column.prop],
attrs: {
rowspan: rowspan
}
};
} else {
return null;
}
},
getRowspan(row, prop) {
let rowspan = 1;
let curVal = row[prop];
for (let i = this.tableData.indexOf(row) + 1; i < this.tableData.length; i++) {
if (curVal === this.tableData[i][prop]) {
rowspan++;
} else {
break;
}
}
return rowspan;
}
}
};
</script>
```
在上面的代码中,我们通过`customRender`方法来自定义表格中"合并列"的渲染方式。在该方法中,我们根据当前行的mergeKey字段与前一行的mergeKey字段是否相等,来判断是否需要进行列合并。然后根据合并的行数设置对应的`rowspan`属性,从而实现合并列。
1. 为表格数据源添加字段用于表示要合并的列,例如"mergeKey"字段。
2. 在Table组件中,设置需要合并的列的render属性为一个自定义的模板方法。在该方法中,可以根据当前行的数据,判断是否需要进行列合并,并返回对应的合并信息。
```vue
<template>
<Table :data="tableData">
<Table-column prop="name" label="姓名"></Table-column>
<Table-column prop="age" label="年龄"></Table-column>
<Table-column prop="gender" label="性别"></Table-column>
<Table-column label="合并列" :render="customRender"></Table-column>
</Table>
</template>
<script>
export default {
data() {
return {
tableData: [
{ name: '张三', age: 20, gender: '男', mergeKey: '1' },
{ name: '李四', age: 25, gender: '女', mergeKey: '1' },
{ name: '王五', age: 30, gender: '男', mergeKey: '2' },
{ name: '赵六', age: 35, gender: '女', mergeKey: '2' }
]
};
},
methods: {
customRender(h, { row, column, $index }) {
if (row.mergeKey !== this.tableData[$index - 1]?.mergeKey) {
const rowspan = this.getRowspan(row, column.prop);
return {
children: row[column.prop],
attrs: {
rowspan: rowspan
}
};
} else {
return null;
}
},
getRowspan(row, prop) {
let rowspan = 1;
let curVal = row[prop];
for (let i = this.tableData.indexOf(row) + 1; i < this.tableData.length; i++) {
if (curVal === this.tableData[i][prop]) {
rowspan++;
} else {
break;
}
}
return rowspan;
}
}
};
</script>
```
在上面的代码中,我们通过`customRender`方法来自定义表格中"合并列"的渲染方式。在该方法中,我们根据当前行的mergeKey字段与前一行的mergeKey字段是否相等,来判断是否需要进行列合并。然后根据合并的行数设置对应的`rowspan`属性,从而实现合并列。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询