表格中批量校验每行的某些单元格的表单校验

1、不分页表格表单校验

1、表格外面套一个form表单来实现批量校验

 <el-form style="margin-top:0" ref="taskRef" :rules="rulesTask" :model="taskForm">
              <el-table :key="activeName" :data="detailTableData" border :header-cell-style="{ background: '#fff' }">
                <el-table-column align="center" type="index" width="80" label="序号"></el-table-column>
                <el-table-column align="center" prop="itemNum" label="子目号"></el-table-column>
                <el-table-column align="center" prop="itemName" label="子目名称"></el-table-column>
                <el-table-column align="center" prop="units" label="单位"></el-table-column>
                <el-table-column align="center" prop="quantity" label="数量"></el-table-column>
                <el-table-column v-if="activeName !== 'first'" align="center" prop="quantityAfterChange" label="变更后的数量合计"></el-table-column>
                <el-table-column align="center" prop="price" label="单价(元)"></el-table-column>
                <el-table-column align="center" prop="amount" label="合价(元)"></el-table-column>
                <el-table-column v-if="activeName=='first'" align="center" prop="temporaryPrice" label="暂计量单价(元)">
                  <template slot-scope="{row,$index}">
                    <span v-if="handleType=='view'||!row.editable">{{row.temporaryPrice}}</span>
                    <el-form-item v-else :prop="'taskData.' + $index + '.temporaryPrice'" :rules="temporaryPriceRules(row,$index)">
                      <el-input-number
                        clearable
                        style="width:120px"
                        v-model="row.temporaryPrice"
                        :max="999999.99"
                        :min="0"
                        :precision="2"
                        :controls="false"
                        size="mini"
                        placeholder="请输入"
                        @change="priceChange(row,$index)"
                      ></el-input-number>
                    </el-form-item>
                  </template>
                </el-table-column>
                <el-table-column v-if="activeName=='first'" align="center" prop="temporaryAmount" label="暂计量合价(元)">
                  <template slot-scope="{row}">
                    <span>{{row.temporaryAmount}}</span>
                  </template>
                </el-table-column>
                <el-table-column align="center" :prop="activeName=='first'?'remarks':''" label="备注">
                  <template slot="header">
                    <span>备注</span>
                    <el-tooltip v-if="activeName=='first'" class="item" effect="dark" content="说明:修改暂计量单价,须填写价格修订原因。" placement="top-start">
                      <i class="el-icon-question"></i>
                    </el-tooltip>
                  </template>
                  <template slot-scope="{row,$index}">
                    <span v-if="activeName!='first'">{{row.remarks}}</span>
                    <div v-else>
                      <span v-if="handleType=='view'||!row.editable">{{row.remarks}}</span>
                      <el-form-item v-else :prop="'taskData.' + $index + '.remarks'" :rules="rulesForRow(row,$index)">
                        <el-input :maxlength="50" v-model="row.remarks" placeholder="请输入"></el-input>
                      </el-form-item>
                    </div>
                  </template>
                </el-table-column>
              </el-table>
            </el-form>

2 、定义的data部分

 //1.data定义校验规则
rulesTask: {
        remarks: { required: true, message: '请输入备注', trigger: 'blur' },
        temporaryPrice: { required: true, message: '请输入暂计量单价', trigger: 'blur' }
   },

//2、计算属性中定义校验的表格数据
 computed: {
    taskForm() {
      return { taskData: this.detailTableData };
    },

  },

// 3、计算属性中返回单个单元格的校验规则
temporaryPriceRules() {
      return (rowData, index) => {
        return this.rulesTask.temporaryPrice;
      };
    },

3、保存的时候和正常的form表单校验一样,toast顶部提示,单元格会标红

this.$refs.taskRef.validate(async valid => {
            if (valid) {
              this.$message({
                type: 'success',
                message: '保存成功'
              });
            } else {
              this.$message.error('有必填项未填写');
            }
          });

4、效果 

2、分页表格批量表单校验

1、html部分

 <el-form style="margin-top:0" ref="taskRef" :rules="rulesTask" :model="taskForm">
              <el-table :key="activeName" :data="displayedData" border :header-cell-style="{ background: '#fff' }">
                <el-table-column align="center" type="index" width="80" label="序号"></el-table-column>
                <el-table-column align="center" prop="itemNum" label="子目号"></el-table-column>
                <el-table-column align="center" prop="itemName" label="子目名称"></el-table-column>
                <el-table-column align="center" prop="units" label="单位"></el-table-column>
                <el-table-column align="center" prop="quantity" label="数量"></el-table-column>
                <el-table-column v-if="activeName !== 'first'" align="center" prop="quantityAfterChange" label="变更后的数量合计"></el-table-column>
                <el-table-column align="center" prop="price" label="单价(元)"></el-table-column>
                <el-table-column align="center" prop="amount" label="合价(元)"></el-table-column>
                <el-table-column v-if="activeName=='first'" align="center" prop="temporaryPrice" label="暂计量单价(元)">
                  <template slot-scope="{row,$index}">
                    <span v-if="handleType=='view'||!row.editable">{{row.temporaryPrice}}</span>
                    <el-form-item v-else :prop="'taskData.' + $index + '.temporaryPrice'" :rules="temporaryPriceRules(row,$index)">
                      <el-input-number
                        clearable
                        style="width:120px"
                        v-model="row.temporaryPrice"
                        :max="999999.99"
                        :min="0"
                        :precision="2"
                        :controls="false"
                        size="mini"
                        placeholder="请输入"
                        @change="priceChange(row,$index)"
                      ></el-input-number>
                    </el-form-item>
                  </template>
                </el-table-column>
                <el-table-column v-if="activeName=='first'" align="center" prop="temporaryAmount" label="暂计量合价(元)">
                  <template slot-scope="{row}">
                    <span>{{row.temporaryAmount}}</span>
                  </template>
                </el-table-column>
                <el-table-column align="center" :prop="activeName=='first'?'remarks':''" label="备注">
                  <template slot="header">
                    <span>备注</span>
                    <el-tooltip v-if="activeName=='first'" class="item" effect="dark" content="说明:修改暂计量单价,须填写价格修订原因。" placement="top-start">
                      <i class="el-icon-question"></i>
                    </el-tooltip>
                  </template>
                  <template slot-scope="{row,$index}">
                    <span v-if="activeName!='first'">{{row.remarks}}</span>
                    <div v-else>
                      <span v-if="handleType=='view'||!row.editable">{{row.remarks}}</span>
                      <el-form-item v-else :prop="'taskData.' + $index + '.remarks'" :rules="rulesForRow(row,$index)">
                        <el-input :maxlength="50" v-model="row.remarks" placeholder="请输入"></el-input>
                      </el-form-item>
                    </div>
                  </template>
                </el-table-column>
              </el-table>
              <pagination :total="detailTableData.length" :page.sync="pageNum" :limit.sync="perPage" @pagination="check"></pagination>
            </el-form>

2、计算属性部分

  computed: {
    displayedData() {
      // 根据当前页码和每页显示条目数计算起始和结束索引
      const startIndex = (this.pageNum - 1) * this.perPage;
      const endIndex = startIndex + this.perPage;
      return this.detailTableData.slice(startIndex, endIndex);
    },

    taskForm() {
      return { taskData: this.displayedData };
    },
    
  },

3、js逻辑部分

  check(){
     this.saveProportionForm();
  },
// 保存修改
    async saveProportionForm() {
      this.$refs.proportionForm.validate(async valid => {
        if (valid) {
          if (this.validateDetailTableData()) {
            this.validTable(true);
          } else {
            this.validTable(false);
            this.$message.error('有必填项未填写');
          }
        } else {
          this.$message.error('有必填项未填写');
        }
      });
    },
    validTable(type) {
      this.$refs.taskRef.validate(async valid => {
        if (valid) {
          if (type) {
            //当校验通过的时候才在这里写ajax之类的请求
          }
        }
      });
    },
    validateDetailTableData() {
      let isValid = true;

      for (let i = 0; i < this.detailTableData.length; i++) {
        const rowData = this.detailTableData[i];

        // 对每一行数据进行校验,根据具体的校验规则进行判断

        if (!rowData.temporaryPrice && rowData.editable) {
          isValid = false;
        }

        // 继续校验其他字段...
      }

      return isValid; // 返回校验结果
    },

实现效果

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您使用 Element Plus 表单嵌套表格,并且需要进行校验,可以使用以下步骤: 1. 在表格定义需要校验的列,并设置验证规则。 2. 在表单使用 el-table-column 组件来定义表格的列,同时设置 prop 属性为表格数据的对应字段。 3. 在 el-table-column 组件,使用 scoped slot 来定义表格单元格的内容,同时使用 el-form-item 组件来包裹表格单元格的输入控件,以实现表格单元格的输入控件校验。 4. 在 el-form 组件使用 ref 属性来设置表单的引用名称,以便在提交表单时进行表单校验。 5. 在表单提交时,可以通过 this.$refs.form.validate() 方法来进行表单校验。 下面是一个使用 Element Plus 表单嵌套表格进行校验的示例代码: ```html <template> <el-form ref="form" :model="form" label-width="120px" rules="rules"> <el-table :data="tableData"> <el-table-column prop="name" label="姓名"> <template #default="{ row }"> <el-form-item :prop="'name' + row.id"> <el-input v-model="row.name"></el-input> </el-form-item> </template> </el-table-column> <el-table-column prop="age" label="年龄"> <template #default="{ row }"> <el-form-item :prop="'age' + row.id"> <el-input v-model="row.age"></el-input> </el-form-item> </template> </el-table-column> </el-table> <el-button type="primary" @click="submitForm">提交</el-button> </el-form> </template> <script> export default { data() { return { form: { tableData: [ { id: 1, name: '', age: '' }, { id: 2, name: '', age: '' } ] }, rules: { tableData: [ { type: 'array', required: true, message: '请至少添加一条记录' }, { validator: (rule, value, callback) => { for (let i = 0; i < value.length; i++) { const row = value[i] const nameProp = `name${row.id}` const ageProp = `age${row.id}` this.$refs.form.validateField(nameProp, error => { if (error) { callback(error) } else { this.$refs.form.validateField(ageProp, error => { if (error) { callback(error) } else { callback() } }) } }) } }, trigger: 'submit' } ] } } }, methods: { submitForm() { this.$refs.form.validate(valid => { if (valid) { console.log('表单校验通过') } else { console.log('表单校验失败') } }) } } } </script> ``` 在这个示例代码,我们定义了一个包含两列(姓名和年龄)的表格,同时设置了每行数据的校验规则。在表格单元格,我们使用了 el-form-item 组件来包裹输入控件,并且在 el-form 组件设置了引用名称为 form,以便在提交表单时进行校验。在表单提交时,我们通过调用 this.$refs.form.validate() 方法来进行表单校验

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值