VUE2用elementUI实现父组件中校验子组件中的表单

需求是VUE2框架用elementUI写复杂表单组件,比如,3个相同功能的表单共用一个提交按钮,把相同功能的表单写成一个子组件,另一个父组件包含子组件的重复调用和一个提交按钮,并且要求提交时校验必填项。

注意:

1.validate函数不传参数就会返回一个promise

2.子组件中写了this.$refs.form?.map...是因为真实项目中el-form是进行了循环的,这里可以自定义修改

3.父组件中要用promise来处理调用子组件的方法

子组件:

<template>
  <el-form ref="form" :model="formData" :rules="formRules" label-width="120px">
    <el-form-item label="姓名" prop="name">
      <el-input v-model="formData.name"></el-input>
    </el-form-item>
    <el-form-item label="邮箱" prop="email">
      <el-input v-model="formData.email"></el-input>
    </el-form-item>
    <!-- 其他表单项 -->
  </el-form>
</template>

<script>
export default {
  data() {
    return {
      formData: {
        name: '',
        email: ''
        // 其他表单项
      },
      formRules: {
        name: [
          { required: true, message: '请输入姓名', trigger: 'blur' }
        ],
        email: [
          { required: true, message: '请输入邮箱', trigger: 'blur' }
        ]
        // 其他表单项的校验规则
      }
    };
  },
  methods: {
       validateForm() {
      const validatePromises = this.$refs.form?.map(v => {
        return v.validate();
      });

      if (validatePromises) {
        return Promise.all(validatePromises)
          .then(results => {
            // 检查结果数组,如果所有项都是 true,则返回 true,否则返回 false
            return results.every(result => result);
          })
          .catch(() => {
            // 如果有任何验证 Promise 失败,则捕获错误
            return false;
          });
      } else {
        // 如果 this.$refs.form 不存在,直接返回 false 或抛出错误
        return false;
      }
    }
  }
};
</script>

 父组件

<template>
  <div>
    <FormComponent v-for="(ref,index) in formRefs" :key="index" :ref="ref">
    </FormComponent>

    <el-button type="primary" @click="submitForms">提交</el-button>
  </div>
</template>

<script>
import FormComponent from './FormComponent.vue';

export default {
  data() {
    return {
      formRefs: []
    };
  },
  components: {
    FormComponent
  },
  mounted() {
    // 根据需要调用表单的次数,此处假设为10次
    for (let i = 0; i < 10; i++) {
      this.formRefs.push(`form${i + 1}`);
    }
  },
  methods: {
  async onSubmit() {
      // 1、pc端:一次性校验所有题
      Promise.all(
         this.formRefs?.map(v => {
          return this.$refs?.[`${v}`]?.[0]?.validateForm();
        })
      )
        .then(res => {
          if (res?.every(v => v)) {
            const formDataList = this.formRefs?.map(v => {
              return this.$refs?.[`${v}`]?.[0]?.form;
            });
            // 2、提交问卷
            console.log('formDataList', formDataList);
          } else {
            // 找出所有校验不通过的表单
            const falseFormList = res.filter(v => !v);
            // TODO 自定义操作
          }
        })
        .catch(() => {
          this.$alert('请稍后重试', '提示', {
            dangerouslyUseHTMLString: true
          });
        });
    }
  }
};
</script>

相关推荐

  1. VUE2elementUI实现组件校验组件

    2024-07-11 15:08:03       23 阅读
  2. Vue.js 组件调用组件方法

    2024-07-11 15:08:03       46 阅读
  3. VUE组件组件进行传值

    2024-07-11 15:08:03       32 阅读
  4. Vue3组件调用组件方法

    2024-07-11 15:08:03       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 15:08:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 15:08:03       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 15:08:03       58 阅读
  4. Python语言-面向对象

    2024-07-11 15:08:03       69 阅读

热门阅读

  1. 解释一下DecorView和Window之间的交互。

    2024-07-11 15:08:03       24 阅读
  2. 【AI原理解析】-目标检测概述

    2024-07-11 15:08:03       20 阅读
  3. 24/07/10数据结构(4.1209)单链表OJ

    2024-07-11 15:08:03       22 阅读
  4. python批量读取Excel数据写入word

    2024-07-11 15:08:03       25 阅读
  5. 富格林:正确击破暗箱稳健出金

    2024-07-11 15:08:03       18 阅读
  6. 云原生监控-Kubernetes-Promethues-Grafana

    2024-07-11 15:08:03       15 阅读