使用element-ui 表格有一些特殊的表格

还有一种就是内容部分有合并:

这种情况按照element表格得数据我们需要和后台来配合对数据来进行一个处理

这里我就只放一些可能会用到得代码,其他的就不放了,防止受到干扰

 <el-table
          :data="baseDataList"  
          ref="myTable" 
          :span-method="objectSpanMethod"
          :key="resetTableHeader" 
        ></el-table>

key: 是我们在处理表头的时候需要用到,如果表头是根据后台得数据来动态生成的,那我们在生成之后防止表格样式出现错乱或者不是我们静态放置得样子的时候就需要放key,具体用法就是data当中定义一个变量(resetTableHeader) ,当我们动态生成了表头的时候 this.resetTableHeader = !this.resetTableHeader让表格重新渲染一次就可以了

或者是

 this.$nextTick(() => {
             // 初始化表格
             this.$refs.myTable.doLayout();
         });

这是我后台返回的数据,不知道几行为一列,所以有多少条数据其实应该有一个总的名称的时候进行合并,这里采用districtId 辖区来进行判断,是不是属于用一个辖区的,  bayonetId 卡口也可能是某个卡口有多条数据

{
         "success": true,
         "results": [
           {
             "flow": 19028,
             "dimensionMap": {
               "VehicleType": [//车型
                 {
                   "dimensionValue": "K39",
                   "statValue": 342
                 },
                 {
                   "dimensionValue": "M2",
                   "statValue": 144
                 }
               ]
             },
             "districtId": "430202",//辖区
             "bayonetId": "430202600011001",//卡口
             "transectId":"4302026000110011",//断面
             "laneNo":1,
             "statTimeStr": "2023-01-05"
           },
           {
             "flow": 19028,
             "dimensionMap": {
               "VehicleType": [
                 {
                   "dimensionValue": "K39",
                   "statValue": 342
                 },
                 {
                   "dimensionValue": "M2",
                   "statValue": 144
                 }
               ]
             },
             "districtId": "430202",
             "bayonetId": "430202600021002",
             "transectId":"4302026000210021",
             "laneNo":1,
             "statTimeStr": "2023-01-05"
           },
           {
             "flow": 19028,
             "dimensionMap": {
               "VehicleType": [
                 {
                   "dimensionValue": "K39",
                   "statValue": 342
                 },
                 {
                   "dimensionValue": "M2",
                   "statValue": 144
                 }
               ]
             },
             "districtId": "430202",
             "bayonetId": "430202600021002",
             "transectId":"4302026000210022",
             "laneNo":1,
             "statTimeStr": "2023-01-06"
           },
           {
             "flow": 19028,
             "dimensionMap": {
               "VehicleType": [
                 {
                   "dimensionValue": "K39",
                   "statValue": 342
                 },
                 {
                   "dimensionValue": "M2",
                   "statValue": 144
                 }
               ]
             },
             "districtId": "430203",
             "bayonetId": "430203610041103",
             "transectId":"4302036100411032",
             "laneNo":1,
             "statTimeStr": "2023-01-06"
           },
           {
             "flow": 19028,
             "dimensionMap": {
               "VehicleType": [
                 {
                   "dimensionValue": "K39",
                   "statValue": 342
                 },
                 {
                   "dimensionValue": "M2",
                   "statValue": 144
                 }
               ]
             },
             "districtId": "430203",
             "bayonetId": "430203610041103",
             "transectId":"4302036100411032",
             "laneNo":1,
             "statTimeStr": "2023-01-06"
           },
           {
             "flow": 19028,
             "dimensionMap": {
               "VehicleType": [
                 {
                   "dimensionValue": "K39",
                   "statValue": 342
                 },
                 {
                   "dimensionValue": "M2",
                   "statValue": 144
                 }
               ]
             },
             "districtId": "430203",
             "bayonetId": "430203710331105",
             "transectId":"4302037103311051",
             "laneNo":1,
             "statTimeStr": "2023-01-06"
           },


         ],
         "msg": "成功",
         "msgCode": 0
       };

合并行的方法,获取到的数据调用这个方法,来判断哪些要合并,合并几行或者几列,在数据中添加属性来标识

  tableHeaderFn(table) {
      // districtId: 辖区id
      // bayonetId: 卡口id
      table.forEach((item, index) => {
        // 添加合并行标识
        table[0].isFirst = true;
        table[0].isTwo = true;
        // 当前对比的合并行
        let mergeRow = table[0];
        let mergeRowKK = table[0];
        // 当前对比值
        let curKey = mergeRow.districtId;
        let curId = mergeRow.bayonetId;
        // 当前行的index
        let nowIndex = 1;
        let nowKKIndex = 1;
        // 相同个数
        let sameNum = 1;
        let kkNum = 1;
        // 循环添加合并标识;
        // ++++++++++++++ BEGIN  合并辖区 +++++++++++++++++++++
        while (nowIndex < table.length) {
          table[nowIndex].isFirst = false;
          table[nowIndex].sameNum = 1;
          mergeRow.sameNum = sameNum;

          if (table[nowIndex].districtId == curKey) {
            // 如果当前值与需要对比的值相等 sameNum+1
            sameNum += 1;
            // 如果数组最后一个的值跟前一个的值相等
            if (nowIndex == table.length - 1) {
              mergeRow.sameNum = sameNum;
            }
          } else {
            // 如果不相等 设置当前对象为新的开始合并对象
            mergeRow.sameNum = sameNum;
            mergeRow = table[nowIndex];
            mergeRow.isFirst = true;
            curKey = mergeRow.districtId;
            sameNum = 1;
          }
          nowIndex++;
        }
        // ++++++++++++++ END  合并辖区 +++++++++++++++++++++

        // ++++++++++++++ BEGIN  卡口 +++++++++++++++++++++
        while (nowKKIndex < table.length) {
          table[nowKKIndex].isTwo = false;
          table[nowKKIndex].kkNum = 1;
          mergeRowKK.kkNum = kkNum;
          if (table[nowKKIndex].bayonetId == curId) {
            // 如果当前值与需要对比的值相等 curId+1
            kkNum += 1;
            // 如果数组最后一个的值跟前一个的值相等
            if (nowKKIndex == table.length - 1) {
              mergeRowKK.kkNum = kkNum;
            }
          } else {
            mergeRowKK.kkNum = kkNum;
            mergeRowKK = table[nowKKIndex];
            mergeRowKK.isTwo = true;
            curId = mergeRowKK.bayonetId;
            kkNum = 1;
          }
          nowKKIndex++;
        }
        // ++++++++++++++ END  卡口 +++++++++++++++++++++
      });
      return table;
    },

element表格合并的方法 span-method: 合并行或者例(这里的案例是合并行)

  objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 1) {
        if (row.isFirst) {
          return {
            rowspan: row.sameNum,
            colspan: 1,
          };
        } else {
          return {
            rowspan: 0,
            colspan: 0,
          };
        }
      }

      if (columnIndex === 2) {
        if (row.isTwo) {
          return {
            rowspan: row.kkNum,
            colspan: 1,
          };
        } else {
          return {
            rowspan: 0,
            colspan: 0,
          };
        }
      }
    },

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果您使用的是 element-plus 的表格和表单组件,并且需要进行校验,可以使用其提供的校验规则和自定义校验方法。 对于表格组件,您可以在列定义中添加 `rules` 属性来设置校验规则,例如: ```html <el-table :data="tableData"> <el-table-column prop="name" label="姓名" :rules="[{ required: true, message: '请输入姓名', trigger: 'blur' }]"></el-table-column> <el-table-column prop="age" label="年龄" :rules="[{ required: true, message: '请输入年龄', trigger: 'blur' }, { type: 'number', message: '年龄必须为数字值' }]"></el-table-column> </el-table> ``` 在上述示例中,我们为姓名和年龄两列设置了校验规则,其中 `required` 表示必填,`type` 表示输入类型。当表格中的数据被修改时,如果不符合校验规则,将会弹出相应的提示信息。 对于表单组件,您可以使用 `el-form` 组件中的 `rules` 属性来设置校验规则,例如: ```html <el-form :model="form" :rules="rules"> <el-form-item label="姓名" prop="name"> <el-input v-model="form.name"></el-input> </el-form-item> <el-form-item label="年龄" prop="age"> <el-input v-model.number="form.age"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm">提交</el-button> </el-form-item> </el-form> ``` 在上述示例中,我们设置了一个 `form` 对象来存储表单数据,并为姓名和年龄两个字段设置了校验规则。当用户提交表单时,如果不符合校验规则,将会弹出相应的提示信息。 您还可以使用自定义校验方法来实现更复杂的校验逻辑,例如: ```html <el-form :model="form" :rules="rules"> <el-form-item label="密码" prop="password"> <el-input v-model="form.password" type="password"></el-input> </el-form-item> <el-form-item label="确认密码" prop="password2"> <el-input v-model="form.password2" type="password"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm">提交</el-button> </el-form-item> </el-form> ``` ```js data() { return { form: { password: '', password2: '' }, rules: { password: [ { required: true, message: '请输入密码', trigger: 'blur' }, { validator: this.validatePassword, trigger: 'blur' } ], password2: [ { required: true, message: '请再次输入密码', trigger: 'blur' }, { validator: this.validatePassword2, trigger: 'blur' } ] } } }, methods: { validatePassword(rule, value, callback) { if (value.length < 6 || value.length > 16) { callback(new Error('密码长度应为6-16位')) } else { callback() } }, validatePassword2(rule, value, callback) { if (value !== this.form.password) { callback(new Error('两次输入的密码不一致')) } else { callback() } }, submitForm() { this.$refs.form.validate(valid => { if (valid) { // 校验通过,提交表单 } else { // 校验不通过,弹出提示信息 } }) } } ``` 在上述示例中,我们为密码和确认密码两个字段设置了自定义校验方法 `validatePassword` 和 `validatePassword2`,用于检查密码长度和两次输入的密码是否一致。在提交表单时,我们调用 `$refs.form.validate` 方法来进行校验,并根据校验结果来决定是否提交表单。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值