校验el-table中表单项

需求:

表格中每一行都有几个必填项,如用户提交时有未填的选项,将该选项标红且给出提示,类似el-form 的那种校验

el-table本身并没有校验的方法,而且每一行的输入框也是通过插槽来实现的,因此我们要自己跟el-table本身自带的属性来实现这个功能。接下来主角的登场
在这里插入图片描述
这个属性可以为每个单元格添加一个类名, 我的思路是

  1. 校验未通过的信息写在输入框的下方,通过display:none隐藏掉
  2. 在提交的时候先校验,如果存在必填项为空,则为该选项所存在的单元格添加一个“error-cell”的类名。
  3. 在此类名下的错误信息以及输入框边框变红通过已经写好的css来实现
    手下先做好准备工作
<el-table-column prop="age" label="年龄">
      <template slot-scope="{ row }">
          <el-input v-model="row.age" />
          <div class="tips">请输入年龄</div>
      </template>
 </el-table-column>
<el-table-column prop="backUp" label="年龄">
      <template slot-scope="{ row }">
          <el-input size="mini" type="textarea" v-model.trim="row.backUp" />
          <div class="tips">请输入备注</div>
     </template>
</el-table-column>
.tips {
     display: none; 
     font-size: 12px;
}

提交时进行校验

// 校验表格  是否存在未填选项
var _validate = this.tableData.some((item) => !item.age || !item.backUp );
//存在未填选项  将该选项加上校验未通过类名 同时return禁止提交
if (_validate) {
     this.cellClass = ({ row, columnIndex }) => {
          if (
                (row.age === '' && columnIndex === 0) ||
                (row.backUp === '' && columnIndex === 1)
              ) {
                 return 'error-cell';
          }
      };
     return;
}

校验未通过的 展示错误信息

.error-cell {
        .el-input__inner {
            border-color: #f56c6c;
        }
        .tips {
            display: block;
            color: #f56c6c;
        }
}

附上完整代码

<template>
  <div class="page">
    <el-table :data="tableData" :cell-class-name="cellClass">
      <el-table-column prop="age" label="年龄">
        <template slot-scope="{ row }">
          <el-input v-model="row.age" />
          <div class="tips">请输入年龄</div>
        </template>
      </el-table-column>
      <el-table-column prop="backUp" label="年龄">
        <template slot-scope="{ row }">
          <el-input size="mini" type="textarea" v-model.trim="row.backUp" />
          <div class="tips">请输入备注</div>
        </template>
      </el-table-column>
    </el-table>
    <el-button @click="submit">提交</el-button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        { age: '1', backUp: '2' },
        { age: '1', backUp: '1' },
        { age: '', backUp: '1' }
      ],
      cellClass: null
    };
  },
  methods: {
    submit() {
      // 校验表格  是否存在未填选项
      var _validate = this.tableData.some(item => !item.age || !item.backUp);
      //存在未填选项  将该选项加上校验未通过类名 同时return禁止提交
      if (_validate) {
        this.cellClass = ({ row, columnIndex }) => {
          if ((row.age === '' && columnIndex === 0) || (row.backUp === '' && columnIndex === 1)) {
            return 'error-cell';
          }
        };
        return;
      }
      //校验通过
      console.log('校验通过');
    }
  }
};
</script>

<style lang="scss" scoped>
::v-deep.page {
  .tips {
    display: none;
    font-size: 12px;
  }
  .error-cell {
    .el-input__inner {
      border-color: #f56c6c !important;
    }
    .tips {
      display: block;
      color: #f56c6c;
    }
  }
}
</style>
### Element UI `el-table` 行内校验实现 为了实现在 `el-table` 中的行内校验,通常会结合 Vue 的双向绑定特性和自定义事件来完成。通过监听表格内的输入变化并即时触发验证逻辑,可以确保每次修改都能得到及时反馈。 #### 数据结构设计 首先,在组件的数据属性中准备待渲染列表以及用于存储错误提示的信息对象: ```javascript data() { return { dataList: [ { id: 1, name: '', age: '' }, // 更多默认条目... ], rules: { name: [{ required: true, message: '请输入姓名', trigger: 'blur' }], age: [{ required: true, pattern: /^\d+$/, message: '年龄应为正整数', trigger: 'blur' }] } }; } ``` 此部分配置了基础数据模型与简单的校验规则集[^1]。 #### 自定义列模板 接着利用 scoped slot 定义可编辑单元格的内容展示方式,并引入 `<el-input>` 输入框作为编辑器;同时附加 `v-model` 和 `@input` 来同步状态变更及触发表单检验函数调用: ```html <template> <el-table :data="dataList"> <!-- 姓名 --> <el-table-column label="姓名" width="180px"> <template v-slot="{ row }"> <el-form-item :prop="'name'" :rules="rules.name"> <el-input v-model.trim="row.name"></el-input> </el-form-item> </template> </el-table-column> <!-- 年龄 --> <el-table-column label="年龄" align="center"> <template v-slot="{ row }"> <el-form-item :prop="'age'" :rules="rules.age"> <el-input type="number" min="0" max="99" step="1" v-model.number="row.age"></el-input> </el-form-item> </template> </el-table-column> ... </el-table> </template> ``` 这里需要注意的是给每一个需要被校验字段指定唯一的 prop 属性以便后续定位具体位置执行相应操作[^2]。 #### 动态表单项路径处理 由于标准形式下的 ElFormItem 组件仅支持静态字符串类型的 prop 参数传递,而实际应用环境中往往涉及到数组索引访问的情况,因此需采用特殊手段解决这一矛盾——即借助于计算属性生成符合预期格式的关键字串表达式: ```javascript computed: { getPropPath(index) { const self = this; return function (field) { return `${index}.${field}`; }; } }, methods: { validateField(rowIndex, callback) { let valid = true; Object.keys(this.rules).forEach((key) => { const path = this.getPropPath(rowIndex)(key); try { this.$refs[path].validate((isValid) => { if (!isValid && valid !== false) { valid = isValid; } }); } catch (_) {} }); typeof callback === "function" && callback(valid); } } ``` 上述代码片段展示了如何构建动态键名映射关系,并提供了一个辅助方法用来逐个检查目标记录下各字段的有效性状况[^3]。 最后,当用户尝试保存更改时,则可以通过遍历整个 dataset 调用前述提到的方法逐一评估其合法性直至全部满足条件为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值