Skip to content

el-form多表单同步提交校验

问题描述

在开发公司的管理系统时,页面存在多个互不关联的表单,需点击提交按钮后 全部校验通过才执行提交逻辑

解决方案

1、每个表单分配唯一 ref
2、每个表单绑定独立的 v-model 和校验规则 rules
3、提交时通过 this.$refs[refName].validate() 获取每个表单的校验结果,用 Promise.all 统一处理。

完成以上设置就可以实现需求了。

vue
<template>
  <div class="multi-form">
    <!-- 表单1:用户信息 -->
    <el-form 
      ref="formUser" 
      :model="userForm" 
      :rules="userRules" 
      label-width="100px"
      class="form-item"
    >
      <el-form-item label="用户名" prop="username">
        <el-input v-model="userForm.username"></el-input>
      </el-form-item>
    </el-form>

    <!-- 表单2:地址信息 -->
    <el-form 
      ref="formAddress" 
      :model="addressForm" 
      :rules="addressRules" 
      label-width="100px"
      class="form-item"
    >
      <el-form-item label="省份" prop="province">
        <el-input v-model="addressForm.province"></el-input>
      </el-form-item>
    </el-form>

    <el-button type="primary" @click="submitAllForms">提交全部表单</el-button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      // 表单1
      userForm: {},
      // 表单1
      userRules: {},
      // 表单2
      addressForm: {},
      // 表单2:校验规则
      addressRules: {}
    }
  },
  methods: {
    // 提交全部表单(核心方法)
    submitAllForms() {
      // 收集所有表单的校验Promise
      const validatePromises = [
        this.$refs.formUser.validate(), // 表单1校验
        this.$refs.formAddress.validate() // 表单2校验
      ];

      // 统一处理所有表单校验结果
      Promise.all(validatePromises)
        .then((results) => {
          // results 是数组,每个元素为对应表单的校验结果(true/false)
          const allPass = results.every(res => res);
          if (allPass) {
            // 所有表单校验通过,执行提交逻辑(如接口请求)
            console.log('全部表单校验通过,提交数据:', {
              user: this.userForm,
              address: this.addressForm
            });
            // 这里可添加 resetFields() 重置表单
            // this.$refs.formUser.resetFields();
            // this.$refs.formAddress.resetFields();
          }
        })
        .catch((err) => {
          // 若有表单校验失败,Element UI 会自动提示错误,此处可补充异常处理
          console.log('表单校验失败:', err);
        });
    }
  }
};
</script>

Designed & Powerd by liujun