element表格列合并、行合并、表头合并以及自定义校验规则和表格内部form表单的校验

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表单的校验的问题就解决了希望能帮助到您,有错误或不规范的也希望您能指出,也欢迎大家跟我一起交流学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值