基于el-table改造自定义增加列 修改列 以及表格具体判断校验

功能上线 十分开森~~
功能描述:基于element-ui的el-table改造,支持自增自定义列,修改当前列信息以及当前列的附加信息,支持修改当前行的信息以及校验,容错回退数据。
接下来庖丁解牛
首先看一下我的自认为写的很low的改造的table 这是目前我能想到的根据业务需求最优的处理方案了
有大神能一段循环代码就可以处理的欢迎提建议赐教

<el-tabs v-model="activeName" type="card" @tab-click="handleClick">
          <el-tab-pane label="商品信息" name="two"></el-tab-pane>
          <div>
            <div class="table-div" v-if="goodsList1.length > 0">
              <h4 class="titleH4">设备单信息</h4>
              <div class="equipment_table">
                <template>
                  <el-table
                    :data="goodsList1.slice((currentPage1 - 1) * pagesize1, currentPage1 * pagesize1)"
                    :row-style="{ height: '50px' }"
                    :default-sort="{ prop: 'goodsNum' }"
                    max-height="300"
                    @header-click="openDetails"
                    @cell-click="cellClick"
                  >
                    <el-table-column prop="goodsSpec" label="原型机BOM" width="140"></el-table-column>
                    <el-table-column prop="goodsProperty1" label="原型机型号" width="140"></el-table-column>
                    <el-table-column prop="mschannelCode" label="生产BOM" width="140"></el-table-column>
                    <el-table-column prop="goodsShowno" label="下单BOM" width="140"></el-table-column>
                    <el-table-column prop="pricesetNprice" label="商品售价" width="140"></el-table-column>
                    <el-table-column prop="contractGoodsPrice" label="减免后价格" width="140"></el-table-column>
                    <el-table-column prop="goodsNum" label="修改后的数量" width="140"></el-table-column>
                    <el-table-column prop="goodsCamount" label="原商品数量" width="140"></el-table-column>
                    <el-table-column prop="memberContactQq" label="电源线适配器" width="140"></el-table-column>
                    <el-table-column prop="contractGoodsAppraise" label="是否触发管控" width="140"></el-table-column>
                    <el-table-column prop="goodsDayinfo" label="产品状态" width="140"></el-table-column>
                    <el-table-column prop="goodsProperty2" label="制式" width="140"></el-table-column>
                    <el-table-column prop="goodsProperty3" label="能耗" width="140"></el-table-column>
                    <el-table-column prop="goodsProperty4" label="时区" width="140"></el-table-column>
                    <el-table-column prop="goodsSpec1" label="维保年限" width="140"></el-table-column>
                    <el-table-column prop="goodsProperty5" label="产品语言包" width="140"></el-table-column>
                    <el-table-column prop="goodsNum" label="商品数量" width="140"></el-table-column>
                    <el-table-column prop="goodsSupplynum" label="剩余数量" width="140"> </el-table-column>

                    <el-table-column
                      v-for="(columnItem, index) in tableColumns"
                      :key="index"
                      :prop="columnItem.prop"
                      :label="columnItem.label"
                      fit
                      :min-width="columnItem.width"
                      style="background-color: rgb(143, 222, 114);"
                    >
                      <template slot-scope="scope">
                        <div></div>
                        <el-input
                          v-if="columnItem.prop.includes('sendgoodsBatch1')"
                          v-model.number="scope.row.sendgoodsBatch1"
                          @blur="goodsBlur($event, scope.row.sendgoodsBatch1, scope.row)"
                          clearable
                        ></el-input>

                        <el-input
                          v-if="columnItem.prop.includes('sendgoodsBatch2')"
                          v-model.number="scope.row.sendgoodsBatch2"
                          @blur="goodsBlur($event, scope.row.sendgoodsBatch2, scope.row)"
                          clearable
                        ></el-input>
                        。。。。此处省略了100个el-input
                        之所写100次判断是为了v-model的绑定唯一,循环写的话我不知道怎么动态绑定v-model


   </template>
                    </el-table-column>
                  </el-table>

自增自定义列

提交自增列的信息,批次作为表头信息
在这里插入图片描述
这是一个集新增编辑于一体的dialong

 <el-dialog :title="newTitle" :visible.sync="centerDialogVisible" width="40%">
      <el-form :label-position="labelPosition" label-width="100px">
        <el-form-item label="关联批次:" v-if="isAddChild">
          <span>{{ editList[0].sendgoodsBatchPno }}</span>
          <!-- <el-input disabled v-model="editList[0].sendgoodsBatchPno"></el-input> -->
        </el-form-item>
        <el-form-item label="发运集:" v-if="isEdit">
          <span>{{ shipSet }}</span>
        </el-form-item>
        <el-form-item label="批次:">
          <el-input v-model="sendgoodsBatchNo" clearable></el-input>
        </el-form-item>
        <el-form-item label="运费:">
          <el-input v-model="transportMoney" clearable></el-input>
        </el-form-item>
        <el-form-item :label="newLabel">
          <el-select v-model="address" @change="changeAddress" placeholder="请选择" value-key="addressId" clearable>
            <el-option v-for="item in forwarderArr" :key="item.value" :label="item.address" :value="item"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="收货地址: " v-if="address.address">
          <span>{{ address.address }}</span>
        </el-form-item>
        <el-form-item label="收货人姓名: " v-if="address.addressMember">
          <span>{{ address.addressMember }}</span>
        </el-form-item>
        <el-form-item label="手机号: " v-if="address.addressPhone">
          <span>{{ address.addressPhone }}</span>
        </el-form-item>
        <el-form-item label="配送方式:">
          <el-select v-model="transportType" placeholder="请选择" clearable>
            <el-option v-for="item in distributionTypeArr" :key="item.expressCode" :label="item.expressName" :value="item.expressCode"> </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="要货时间:">
          <el-date-picker v-model="requestDate" value-format="yyyy-MM-dd" type="date" placeholder="选择日期" clearable> </el-date-picker>
        </el-form-item>
      </el-form>

      <span slot="footer" class="dialog-footer">
        <el-button @click="centerDialogVisible = false">取 消</el-button>
        <el-button v-if="isEdit" type="primary" @click="editSubmit">确 定</el-button>
        <el-button v-if="!isEdit" type="primary" @click="submitBatchEvent">确 定</el-button>
        <span v-if="isEdit">
          <el-button v-if="!isAddChild" type="success" @click="addSubmit">新 增</el-button>
        </span>
      </span>
    </el-dialog>

主要注意一下自增列需要注意每次增加的key值要保持不一样,实现方式往期的文章有介绍过

接下来看一下提交表单的动作

submitBatchEvent() {
      let a = 1
      this.tableColumns.map(vl => {
        if (vl.prop.includes('sendgoodsBatch')) { //判断当前增加了多少列
          a += 1  //自增
        }
      })
      this.sendgoodsBatchNewCode = 'sendgoodsBatch' + a  //生成新的prop
      this.goodsList1.map(vl => {
        vl.sendgoodsParamsBatchOpList.push({
          sendgoodsBatchKey: this.sendgoodsBatchNewCode,
          transportMoney: this.transportMoney,
          address: this.address.address,
          addressMember: this.address.addressMember,
          addressPhone: this.address.addressPhone,
          transportType: this.transportType,
          shipSet: '',
          sendgoodsBatchNo: this.sendgoodsBatchNo,
          requestDate: this.requestDate,
        })
      })  //给大数组填装信息

      this.tableColumns.push({
        prop: this.sendgoodsBatchNewCode,
        label: this.sendgoodsBatchNo,
        width: '150',
      })   //给循环列填装信息

      console.log(this.goodsList1[0].sendgoodsParamsBatchOpList, 'XXXXXXXXXXXXXXXXXXXXXXXX')
      this.centerDialogVisible = false
    },

恭喜你就得到了一个自定义的列
在这里插入图片描述
然后我们可以对自己增加的当前列做点什么呢?

查看详情

对吧 基操 我们看一下刚刚表单提交的信息
在这里插入图片描述

这里主要用到了一个table的表头点击事件@header-click=“openDetails”
在这里插入图片描述
这个宝藏方法可是俺辛辛苦苦问度娘问出来的

 openDetails(column, even) {
      this.column = column     //获取当前列的信息
      console.log(column, '00000000000000000000')
      this.sendgoodsParamsBatchOpList = this.goodsList1[0].sendgoodsParamsBatchOpList 
      console.log(this.sendgoodsParamsBatchOpList, '111111111111111111')
      this.editList = this.sendgoodsParamsBatchOpList.filter(vl => {
        return vl.sendgoodsBatchKey == column.property
      })  //从数组删选出当前列的所有信息
      console.log(this.editList, 'XXXXXXXXXXXXXXXXXXXXXXXX')
      if (this.editList[0].sendgoodsBatchPcode == -1 || this.editList[0].sendgoodsBatchPcode == '' || !this.editList[0].sendgoodsBatchPcode) {
        this.isAddChild = false
        this.newTitle = column.label + '批次'
        this.newLabel = '更新收货地址: '
      } else {
        this.newTitle = column.label + '子批次'
        this.isAddChild = true
      }//给复用框变形

      this.isEdit = true
      this.shipSet = this.editList[0].shipSet
      this.sendgoodsBatchNo = this.editList[0].sendgoodsBatchNo
      this.transportMoney = this.editList[0].transportMoney
      this.address = {}
      this.address.address = this.editList[0].address
      this.address.addressMember = this.editList[0].addressMember
      this.address.addressPhone = this.editList[0].addressPhone
      this.transportType = this.editList[0].transportType  
      if (this.editList[0].requestDate) {
        this.requestDate = timestampToTime(this.editList[0].requestDate)
      } else {
        this.requestDate = ''
      } //处理时间格式
      this.sendgoodsBatchOldNo = this.editList[0].sendgoodsBatchNo
      this.sendgoodsBatchOldCode = this.editList[0].sendgoodsBatchCode  //一系列的赋值操作
      this.centerDialogVisible = true
    },

修改当前列的信息

在这里插入图片描述
在这里插入图片描述
好的 我们修改了当前列的表头信息 以及里面的附加信息
展示一下确认编辑事件逻辑 因为业务关系里面具体逻辑不在赘述

editSubmit() {
      this.goodsList1.map(item => {
        item.sendgoodsParamsBatchOpList.map(vl => {
          if (vl.sendgoodsBatchKey == this.column.property) {  //找到当前列信息
            this.aa = vl.shipSet
            vl.sendgoodsBatchNo = this.sendgoodsBatchNo
          }
          if (vl.shipSet == this.aa) {  //修改信息
            vl.transportMoney = this.transportMoney
            vl.address = this.address.address
            vl.addressMember = this.address.addressMember
            vl.addressPhone = this.address.addressPhone
            vl.transportType = this.transportType
            vl.shipSet = this.shipSet
            vl.requestDate = this.requestDate
          }
        })
      })
      this.tableColumns = []
      if (this.goodsList1[0].sendgoodsParamsBatchOpList.length > 0) {
        this.goodsList1[0].sendgoodsParamsBatchOpList.map(vl => {
          this.tableColumns.push({
            prop: vl.sendgoodsBatchKey,
            label: vl.sendgoodsBatchNo,
            width: '150',
          })
        })
      }
      this.centerDialogVisible = false
    },

该表格还支持复用主分批信息 增加子分批信息 修改某一个分批信息做到该批次信息统一修改

表格的信息校验

1.当输入的数据大于原来的数据时 提示错误 并还原原数据 (区别原有就是空的时候)

2.当输入的信息所有批次的行向数量之和 大于商品总数量的时候 提示错误 并还原原数据

首先要拿到当前input框的位置 也就是你要知道你改的是那个商品下的那个批次
这里又用到了一个宝藏事件方法 @cell-click=“cellClick”
在这里插入图片描述
我们看一下这个方法有多好用

 cellClick(row, column, cell, event) {
      console.log(column, 'cccccccccccccccc')
      this.oldKey = column.property
    },

在这里插入图片描述
他可以拿到当前列的prop 嗯~~我们能拿到prop不就好说了嘛
当输入完后 我们触发失焦事件拿到当前行的数据 行和列加起来对比
xy轴嘛
然后还有一个前提备份数据用来容错还原数据 所以在created阶段先深拷贝一份list备用

   this.OldGoodsList1 = JSON.parse(JSON.stringify(this.goodsList1))

接下来处理失焦事件

 goodsBlur(val, num, value) {
      //如果输入的值大于历史数据 容错并还原历史数据
      this.OldGoodsList1.map(item => {
        if (item.sendgoodsGoodsCode == value.sendgoodsGoodsCode) {
          //对比拿到当前行
          Object.keys(item).forEach(i => {
            if (i == this.oldKey) {
              //对比拿到当前列
              if (item[i]) {
                //item[i]为当前input框原有的值
                if (Number(item[i]) < num) {
                  this.$message.error('不可大于当前值')
                  Object.keys(value).forEach(i => {
                    //循环对比还原数据
                    if (i == this.oldKey) {
                      value[i] = item[i]
                    }
                  })
                }
              }
            }
          })
        }
      })
      //重新计算
      let sum = 0
      // 求和
      Object.keys(value).forEach(i => {
        if (i.includes('sendgoodsBatch')) {
          sum = sum + Number(value[i])
        }
      })
      value.goodsSumNew = sum
      value.goodsSupplynum = value.goodsNum - value.goodsSumNew
      value.goodsResidue = value.goodsNum - value.goodsSumNew
      //如果输入的值和批次所有的值的和大于商品库存数量 容错并还原历史数据
      this.OldGoodsList1.map(item => {
        if (item.sendgoodsGoodsCode == value.sendgoodsGoodsCode) {
          Object.keys(item).forEach(i => {
            if (i == this.oldKey) {
              // 注意区分历史数据为空否
              if (item[i]) {
                if (sum > value.goodsNum) {
                  this.$message.error('分批总数量不能大于商品数量')
                  Object.keys(value).forEach(i => {
                    if (i == this.oldKey) {
                      value[i] = item[i]
                      let sum = 0
                      Object.keys(value).forEach(i => {
                        if (i.includes('sendgoodsBatch')) {
                          sum = sum + Number(value[i])
                        }
                      })
                      value.goodsSumNew = sum
                      value.goodsSupplynum = value.goodsNum - value.goodsSumNew
                      value.goodsResidue = value.goodsNum - value.goodsSumNew
                    }
                  })
                  return
                }
              } else {
                if (sum > value.goodsNum) {
                  this.$message.error('分批总数量不能大于商品数量')
                  Object.keys(value).forEach(i => {
                    if (i == this.oldKey) {
                      value[i] = ''
                      let sum = 0
                      Object.keys(value).forEach(i => {
                        if (i.includes('sendgoodsBatch')) {
                          sum = sum + Number(value[i])
                        }
                      })
                      value.goodsSumNew = sum
                      value.goodsSupplynum = value.goodsNum - value.goodsSumNew
                      value.goodsResidue = value.goodsNum - value.goodsSumNew
                    }
                  })
                  return
                }
              }
            }
          })
        }
      })

      return
      console.log(this.goodsList1, 'sumsumsumsumsumsumsumsum')
    },

在这里插入图片描述
容错并还原历史数据
在这里插入图片描述
到此为止功能全部记录完毕 如有建议多多指教

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 el-table 表格的编辑校验,你可以使用以下方法之一: 1. 在 el-table-column 中使用 scoped slot 的方式自定义编辑组件,并在编辑组件中添加校验逻辑。例如,你可以在编辑组件的 change 事件中进行校验,并通过设置 el-form-item 的 rules 属性实现校验效果。 ```html <el-table :data="tableData"> <el-table-column label="姓名" prop="name"> <template slot-scope="scope"> <el-form-item :prop="'name' + scope.$index" :rules="[{ required: true, message: '请输入姓名', trigger: 'blur' }]"> <el-input v-model="scope.row.name" @change="handleNameChange(scope.row, scope.$index)"></el-input> </el-form-item> </template> </el-table-column> </el-table> ``` 2. 另一种方法是监听 el-table 的 row-change 事件,在事件处理函数中进行校验。你可以在该事件处理函数中获取到当前编辑行的数据,并进行校验逻辑判断。 ```html <el-table :data="tableData" @row-change="handleRowChange"> <el-table-column label="姓名" prop="name"> <template slot-scope="scope"> <el-input v-model="scope.row.name"></el-input> </template> </el-table-column> </el-table> ``` ```javascript methods: { handleRowChange(row) { // 校验逻辑判断 if (!row.name) { this.$message.error('姓名不能为空'); // 可以将错误信息保存在 row 对象的某个属性中,然后在表格中进行展示 row.errorName = '姓名不能为空'; } else { row.errorName = ''; } } } ``` 这些方法可以帮助你在 el-table 表格中实现可编辑校验的功能。根据你的实际需求,选择适合你的方法进行使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值