element表格列合并、行合并、表头合并
话不多说,先上图!
首先咱们可以看到一个比较复杂的表格,在element的基本使用中是找不到这种情况的。这张截图只是截了一点,没有截图完全。
可以看上面这张图,每一个红框就是一个el-table-column,你可以根据你的项目看看需要多少个。
横着框的这几个相邻单元格的table-column的名称为了区别我们尽量将他们定义为一样得名称。
objectSpanMethod({row, column, rowIndex, columnIndex }) {
// console.log(row, column)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (rowIndex === 0 && columnIndex === 0) {
// 0,0是从第一个单元格开始,需要注意的是,他是不考虑表头的,也就是我们第一张图上的损失情况和路基的交汇处。
return {
rowspan: 14, //要合并的行数
colspan: 1
}
}
if (rowIndex !== 0 && rowIndex !== 14 && columnIndex === 0) {
return {
rowspan: 0, //要合并的行数
colspan: 0
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 好,现在看我们的波浪线区间的这两块代码
// 先看0,0的情况,我们是吧0,0单元格的行数给他扩展到了14行,那么如果没有下面那个if判断条件语句的话表格会多出来14行
// 因此我们需要把2-14行的row行数把他置为0,这样第15行就会回到本该呆在的位置,表格也不会突出一部分。
// 后面的这些也是万变不离其宗,也是我合并的其他单元格,大家看看就好。
if (rowIndex === 14 && columnIndex === 0) {
return {
rowspan: 4, //要合并的行数
colspan: 1
}
}
if (
(rowIndex === 0 || rowIndex === 6 || rowIndex === 7 || rowIndex > 9) &&
columnIndex === 1
) {
return {
rowspan: 1,
colspan: 2
}
}
if (
(rowIndex === 0 || rowIndex === 6 || rowIndex === 7 || rowIndex > 9) &&
columnIndex === 2
) {
return {
rowspan: 0,
colspan: 0
}
}
if (rowIndex === 1 && columnIndex === 1) {
return {
rowspan: 3,
colspan: 1
}
}
if (rowIndex > 1 && rowIndex < 4 && columnIndex === 1) {
return {
rowspan: 0,
colspan: 0
}
}
if ((rowIndex === 4 || rowIndex === 8) && columnIndex === 1) {
return {
rowspan: 2,
colspan: 1
}
}
if ((rowIndex === 5 || rowIndex === 9) && columnIndex === 1) {
return {
rowspan: 0,
colspan: 0
}
}
}
好的,这样的话我们的表格内容的行和列就合并完成了,但是表头的合并还没有做,这个方法也获取不到表头单元格,然后我去找了一下element的文档,发现也没有说明,只是告诉了嵌套表头的方法,最后还是依靠着原生JS解决问题!
// 获取表头的所有单元格
var x = document.getElementsByClassName('el-table__header')[0].rows[0].cells
// 将第二列表头单元格的colSpan设为2
x[0].colSpan = 3
x[4].colSpan = 2
x[6].colSpan = 2
// 将第三列表头单元格的display设为none
x[1].style.display = 'none'
x[2].style.display = 'none'
x[5].style.display = 'none'
x[7].style.display = 'none'
好了,这点代码我想就不用多说了,对各位大神来说那是so easy 啦,我也是第一次做这种表格,所以没找到有什么特别好的方法,只是把我怎么实现的写出来了,如果有更简单的方法希望可以留言讨论一下。
自定义校验规则和表格内部的表单校验
相信大家做系统的时候也会遇到这种表格内部输入框的问题,平常的表单校验是比较简单的,element都给写好了,那么这种表格内部的表单是怎么校验的呢我们一起看一看。
// 这里为了清晰明了看见我们就准备了一个el-table-item,
// 通过view我们是可以看到table外面是需要一个form表单包裹着的,并且在数据里面我们table渲染所需要的数组也是放在form表单里面的。
// 其次就是注意看form的model和table的data的写法。
<el-form
:model="dataForm"
:rules="dataRule"
label-width="90px"
ref="dataForm"
size="mini"
>
<el-table
:data="dataForm.reportWeekWaterInfoDTO"
border
style="width: 100%"
:span-method="objectSpanMethod"
>
// 好的,form和table的架子搭好了,就可以定义需要校验的字段了。
// 我们看下面的el-form-item这块,写了prop和rules两个属性通过表格的scope.$index来区分每行的同一个字段名
// 再从下方的datarules里面写好对应的校验规则即可。
<el-table-column
header-align="center"
align="center"
label="灾毁数量"
>
<template slot-scope="scope">
<el-form-item
label-width="0"
:prop="
'reportWeekWaterInfoDTO.' + scope.$index + '.damageCount2'
"
:rules="dataRule.damageCount2"
v-if="
scope.row.date == '立方米/公里' ||
scope.row.date === '平方米/公里' ||
scope.row.date === '立方米/处' ||
scope.row.date === '处/条'
"
>
<el-input
v-model="scope.row.damageCount2"
></el-input></el-form-item
><span v-else>-</span>
</template>
</el-table-column></el-table
>
</el-form>
// data部分
data() {
const isMoney = (rule, value, callback) => {
const percent = /^\d*(?:\.\d{0,10})?$/
if (!percent.test(value)) {
return callback(new Error('必须为数字类型'))
} else {
callback()
}
}
return {
visible: false,
dataForm: {
// Edit: 'add',
id: undefined,
organizeId: undefined,
startTime: '',
endTime: '',
reportWeekWaterInfoDTO: [
{
date: '立方米/公里',
type: '损失情况',
type1: '路基',
itemName: '路基',
itemCode: 1,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '平方米/公里',
type: '损失情况',
type1: '路面',
itemName: '沥青路面',
itemCode: 2,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '平方米/公里',
type: '损失情况',
type1: '路面',
itemName: '水泥路面',
itemCode: 3,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '平方米/公里',
type: '损失情况',
type1: '路面',
itemName: '砂石路面',
itemCode: 4,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '座',
type: '损失情况',
type1: '桥梁',
itemName: '全毁',
itemCode: 5,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '座',
type: '损失情况',
type1: '桥梁',
itemName: '局部毁',
itemCode: 6,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '道',
type: '损失情况',
type1: '隧道',
itemName: '隧道',
itemCode: 7,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '道',
type: '损失情况',
type1: '涵洞',
itemName: '涵洞',
itemCode: 8,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '处',
type: '损失情况',
type1: '防护工程',
itemName: '护坡',
itemCode: 9,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '处',
type: '损失情况',
type1: '防护工程',
itemName: '驳岸、挡墙',
itemCode: 10,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '立方米/处',
type: '损失情况',
type1: '坍塌方',
itemName: '坍塌方',
itemCode: 11,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '处/条',
type: '损失情况',
type1: '公路中断',
itemName: '公路中断',
itemCode: 12,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '万元',
type: '损失情况',
type1: '其他灾毁损失',
itemName: '其他灾毁损失',
itemCode: 13,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '万元',
type: '损失情况',
type1: '损失合计',
itemName: '损失合计',
itemCode: 14,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '处/条',
type: '抢通情况',
type1: '已抢通公路',
itemName: '已抢通公路',
itemCode: 15,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '人',
type: '抢通情况',
type1: '已投入人力',
itemName: '已投入人力',
itemCode: 16,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '台班',
type: '抢通情况',
type1: '已投入机械',
itemName: '已投入机械',
itemCode: 17,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
},
{
date: '万元',
type: '抢通情况',
type1: '已投入资金',
itemName: '已投入资金',
itemCode: 18,
damageCount: 0,
damageCount2: 0,
waterDamageCount: 0,
waterDamageCount2: 0,
damageAmount: 0,
waterDamageAmount: 0
}
]
},
dataRule: {
damageCount: [{ validator: isMoney, trigger: 'blur' }],
damageCount2: [{ validator: isMoney, trigger: 'blur' }],
waterDamageCount: [{ validator: isMoney, trigger: 'blur' }],
waterDamageCount2: [{ validator: isMoney, trigger: 'blur' }],
damageAmount: [{ validator: isMoney, trigger: 'blur' }],
waterDamageAmount: [{ validator: isMoney, trigger: 'blur' }]
},
}
最后,element表格列合并、行合并、表头合并以及表格内部form表单的校验的问题就解决了希望能帮助到您,有错误或不规范的也希望您能指出,也欢迎大家跟我一起交流学习。