el-form+el-table动态表单嵌套以及校验

<template>
  <!-- 考核通知 -->
  <div>
    <el-form :rules="rules" :model="form" ref="form" label-width="120px">
      <el-row>
        <el-col :span="12">
          <el-form-item label="学校" prop="school">
            <el-input v-model="form.school" placeholder="请填写学校"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="班级" prop="classes">
            <el-input
              v-model="form.classes"
              placeholder="请填写班级"
            ></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          人员信息:
          <el-table :data="form.persons" style="width: 100%">
            <el-table-column label="姓名" align="center" width="180">
              <template slot-scope="{ row, $index }">
                <el-form-item
                  :prop="`persons.${$index}.name`"
                  :rules="rules.name"
                  label-width="0"
                >
                  <el-input v-model="row.name" :disabled="row.disabled">
                  </el-input>
                </el-form-item>
              </template>
            </el-table-column>
            <el-table-column prop="age" label="年龄" align="center">
              <template slot-scope="{ row, $index }">
                <el-form-item
                  :prop="`persons.${$index}.age`"
                  :rules="rules.age"
                  label-width="0"
                >
                  <el-input
                    v-model="row.age"
                    :disabled="row.disabled"
                    placeholder="请填写人员姓名"
                  ></el-input>
                </el-form-item>
              </template>
            </el-table-column>
            <el-table-column align="center" width="120px">
              <template slot="header">
                操作
                <el-button size="mini" @click="addTC">添加 </el-button>
              </template>
              <template slot-scope="{ row, $index }">
                <span
                  class="btn"
                  v-show="row.disabled"
                  @click="editTC($index, row)"
                  >编辑</span
                >
                <span
                  class="btn"
                  v-show="row.disabled"
                  @click="deleteTC($index)"
                  >删除</span
                >
                <span
                  class="btn"
                  v-show="!row.disabled"
                  @click="saveTC($index, row)"
                  >保存</span
                >
              </template>
            </el-table-column>
          </el-table>
        </el-col>
      </el-row>

      <el-button type="primary" @click="submit">确认</el-button>
      <el-button @click="resetForm">重置</el-button>
    </el-form>
  </div>
</template>
<script>
export default {
  data() {
    return {
      form: {
        school: "",
        classes: "",
        persons: [
          {
            name: "砍伐者",
            age: 15,
            disabled: false,
          },
        ],
      },
      rules: {
        school: [
          {
            required: true,
            message: "请输入学校",
            trigger: "blur",
          },
        ],
        classes: [
          {
            required: true,
            message: "请输入班级",
            trigger: "blur",
          },
        ],
        name: [
          {
            required: true,
            message: "请输入姓名",
            trigger: "blur",
          },
        ],
        age: [
          {
            required: true,
            message: "请输入年龄",
            trigger: "blur",
          },
        ],
      },
    };
  },
  mounted() {},
  methods: {
    addTC() {
      this.form.persons = [
        ...this.form.persons,
        { name: "", age: "", disabled: false },
      ];
    },
    editTC(index, row) {
      row.disabled = false;
    },
    saveTC(index, row) {
      row.disabled = true;
    },
    deleteTC(index) {
      this.form.persons.splice(index, 1);
    },
    submit() {
      this.$refs.form.validate((valid) => {
        if (valid) {
          alert("校验成功");
        } else {
          return false;
        }
      });
    },
    resetForm() {
      this.$refs.form.resetFields();
    },
  },
};
</script>
<style lang="scss" scoped>
.file-upload {
  text-align: left;
}
.btn {
  cursor: pointer;
}
</style>

Element UI中,`el-table`通常用于展示数据表格,而`el-form`则用于表单验证。要在`el-table`中嵌套`el-form`并实现校验,你需要按照以下步骤操作: 1. **创建表格结构**: - 在`<el-table>`标签内,为每一行数据创建一个`<template>`,在这个模板中包含一个`<el-row>`作为表单的容器,并嵌套一个`<el-form>`。 ```html <el-table :data="tableData"> <el-table-column prop="itemName" label="名称"></el-table-column> <template slot-scope="scope"> <el-row> <el-form :model="formItem" ref="formRef"> <!-- 表单元素如输入框、选择项等 --> </el-form> </el-row> </template> </el-table> ``` 2. **绑定数据和表单模型**: - `formItem`应该是一个数组,对应表格中的每一行,每个元素都是一个单独表单的模型。 - 使用`ref`属性获取`el-form`组件以便于后续的验证操作。 ```javascript export default { data() { return { tableData: [ { itemName: 'Item 1', formItem: {} }, { itemName: 'Item 2', formItem: {} } ], formItem: {}, }; }, //... } ``` 3. **监听表单变化并触发验证**: - 可以在`watch`或者`methods`中设置一个事件处理器,每当`formItem`的数据发生变化时,对表单进行验证。可以利用`el-form`提供的`validate`方法。 ```javascript methods: { handleFormItemChange(item) { this.$refs['formRef'][item.index].validate(); }, }, ``` 4. **表单验证规则**: - 在`el-form`上添加`rules`属性,定义对应的验证规则。例如,你可以使用`required`、`max`、`min`等验证属性。 ```html <el-form :rules="{ required: true }"></el-form> ``` 5. **处理验证结果**: - 验证完成后,需要检查返回的验证结果,如果存在错误,可以显示相应的提示信息。 ```javascript handleFormItemValidate(validated) { if (!validated) { console.log('表单验证失败'); } }, ``` 记得在适当的地方触发`handleFormItemChange`和`handleFormItemValidate`方法,比如当用户提交或修改表单内容时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值