表格嵌套表单的校验

推荐文章:vue+ElementUI 表单嵌套表格逐行校验(新增、编辑)的完美解决方案

文章里写的很详细,就不多介绍。这里写了一个简单的demo,主要标准一下注意点。

<template>
    <div>
      <el-button type="primary" @click="visible=true">新增</el-button>
       <el-dialog title="新增" v-model="visible" width="50%" :close-on-click-modal="false" @close="closeDialog">
           <el-form ref="form" :model="form"  :rules="rules">
                <el-table :data="form.tableData" style="width: 100%;" height="300px" border ref="tableDemo">
                    <el-table-column type="index" width="55" label="序号" align="center"></el-table-column>
                    <el-table-column label="姓名" prop="name" min-width="120"  align="center">
                       <template #default="scope">
                           <el-form-item :prop="'tableData.'+scope.$index+'.name'" :rules='rules.name'>
                            <el-input v-model="scope.row.name"></el-input>
                        </el-form-item>
                       </template>
                    </el-table-column>
                    <el-table-column label="地址" prop="address" min-width="120"  align="center">
                        <template #default="scope">
                           <el-form-item :prop="'tableData.'+scope.$index+'.address'" :rules='rules.address'>
                            <el-input v-model="scope.row.address"></el-input>
                        </el-form-item>
                       </template>
                    </el-table-column>
                     <el-table-column label="操作"  min-width="120"  align="center">
                         <template #default="scope">
                             <div>
                                 <el-button type="text" @click="addItem(scope.row,scope.$index)">添加</el-button>
                                 <el-button type="text" @click="removeItem(scope.$index)">删除</el-button>
                             </div>
                         </template>
                     </el-table-column>
                </el-table>
           </el-form>
           <template #footer>
               <div>
                   <el-button type="primary" @click="save">保存</el-button> 
                   <el-button type="primary" @click="clear">清空</el-button> 
               </div>
           </template> 
       </el-dialog>
    </div>
</template>

<script>
import { ElMessage } from 'element-plus'
export default {
    data() {
        return {
          form:{
               tableData:[
                   {
                       name:undefined,
                       address:undefined
                   }
               ]
          },
          visible:false,
          //表单校验规则
           rules: {
                name: [
                    { required: true, message: '请输入名称', trigger: 'blur' },
                ],
                address:[
                     { required: true, message: '请输入住址', trigger: 'blur' },
                ]
           }
        };
    },
    mounted() {

    },
    methods: {
     //关闭弹窗
     closeDialog(){
         this.visible=false
         this.$refs.form.resetFields()
     },
     //保存
     save(){
       this.$refs.form.validate((valid) => {
          if (valid) {
            alert('submit!');
          } else {
            console.log('error submit!!');
            return false;
          }
        });
     },
     //清空
     clear(){
        this.$refs.form.resetFields()
     },
     //新增行
     addItem(item,index){
        let itemClone=JSON.parse(JSON.stringify(item))
        this.form.tableData.push(itemClone)
     },
     //删除行
     removeItem(index){
      if(this.form.tableData.length>1){
           this.form.tableData.splice(index,1);
      }else{
         ElMessage.warning({
            message: '不允许全部删除',
            type: 'warning'
          });
      }
     }
    }
};
</script>

<style scoped lang="scss">

</style>

注:

  • 表格要嵌套在表单里
 <el-form ref="form" :model="form"  :rules="rules">
       <el-table :data="form.tableData" style="width: 100%;" height="300px" border ref="tableDemo">
       </el-table>
 </el-form>
  • 表格绑定的数据
    绑定的数据必须是表单对象里的一个属性
form:{
      tableData:[
          {
              name:undefined,
              address:undefined
          }
      ]
 },
  • 表单项的属性必须是动态值
<el-table-column label="姓名" prop="name" min-width="120"  align="center">
   <template #default="scope">
       <el-form-item :prop="'tableData.'+scope.$index+'.name'" :rules='rules.name'>
        <el-input v-model="scope.row.name"></el-input>
    </el-form-item>
   </template>
</el-table-column>

:prop="'tableData.'+scope.$index+'.name'" :表格绑定的属性+表格的序号+对应的字段属性,注意后面的点别忘了,本质上是对象,例如:tableData.0.nametableData.0.address

  • 表单整体上绑定校验规则,每一个表单项上也绑定对应的校验。表单项上不绑定校验不生效。例如去掉地址的校验
<el-table-column label="姓名" prop="name" min-width="120"  align="center">
    <template #default="scope">
        <el-form-item :prop="'tableData.'+scope.$index+'.name'" :rules='rules.name'>
         <el-input v-model="scope.row.name"></el-input>
     </el-form-item>
    </template>
 </el-table-column>
 <el-table-column label="地址" prop="address" min-width="120"  align="center">
     <template #default="scope">
        <el-form-item :prop="'tableData.'+scope.$index+'.address'">
         <el-input v-model="scope.row.address"></el-input>
     </el-form-item>
    </template>
 </el-table-column>

在这里插入图片描述

  • 行的新增
 <el-button type="text" @click="addItem(scope.row,scope.$index)">添加</el-button>
 //新增行
 addItem(item,index){
    let itemClone=JSON.parse(JSON.stringify(item))
    this.form.tableData.push(itemClone)
 },
如果您使用 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
发出的红包

打赏作者

无知的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值