vue多个组件校验

模块化开发项目就是导致一个单页面多个组件,我们提交前就需要同时校验多个组件的表单,代码如下;

父组件.vue

点击【保存】按钮的时候需要校验以下父组件基础表单和其他两个子组件的表单,需要给组件加ref属性。
在这里插入图片描述

子组件.vue

就正常用form表单来写

  <a-form ref="formRef" layout="vertical" :model="formData">
    <transition-group name="slide">
      <a-row v-for="(value, index) in formData.bankCardInfo" :key="index" :gutter="80">
        <a-col :span="7">
       <!-- 我的子组件是数组格式,校验深一层,所以field写的稍微复杂一些,一层的话只写属性就行  -->
          <a-form-item
            label="开户银行:"
            :field="'bankCardInfo.' + index + '.bankName'"
            :validate-trigger="['change', 'input']"
            :rules="[{ required: true, message: '请填写开户银行' }]"
          >
            <a-input v-if="isEdit" v-model="value.bankName" allow-clear placeholder="请填写开户银行" />
            <span v-else class="bold-text-span">{{ value.bankName }}</span>
          </a-form-item>
        </a-col>
        <a-col :span="7">
          <a-form-item
            label="开户名称:"
            :field="'bankCardInfo.' + index + '.name'"
            :validate-trigger="['change', 'input']"
            :rules="[{ required: true, message: '请填写开户名称' }]"
          >
            <a-input v-if="isEdit" v-model="value.name" allow-clear placeholder="请填写开户名称" />
            <span v-else class="bold-text-span">{{ value.name }}</span>
          </a-form-item>
        </a-col>
        <a-col :span="7">
          <a-form-item
            label="银行账号:"
            :field="'bankCardInfo.' + index + '.bankNo'"
            :validate-trigger="['change', 'input']"
            :rules="cardRules"
          >
            <a-input v-if="isEdit" v-model="value.bankNo" allow-clear placeholder="请填写银行账号" />
            <span v-else class="bold-text-span">{{ value.bankNo }}</span>
          </a-form-item>
        </a-col>
        <a-col v-if="isEdit" :span="3" class="xPlusMinus">
          <div v-if="formData.bankCardInfo.length == index + 1" class="xPlusMinus-lone" @click="addCard">
            <IconPlusCircle /><span class="xPlusMinus-lone">添加</span>
          </div>
          <div v-if="formData.bankCardInfo.length > 1" class="xPlusMinus-lone" @click="delCard(index)">
            <IconMinusCircle /><span class="xPlusMinus-lone">删除</span>
          </div>
        </a-col>
      </a-row>
    </transition-group>
  </a-form>

子组件.ts

因为后面校验需要用到promise.all,所以子组件的校验返回一个promise对象。

  /**
   * @function validateForm
   * @description 表单校验
   */
  const validateForm = () => {
    return new Promise((resolve: any) => {
      base.formRef.validate((valid: any) => {
        emit('interData', valid, base.formData.bankCardInfo); // 校验的时候,可以把子组件的数据传递给父组件。自己写方法整合数据就行,提交表单的时候用,这里就不写父组件的方法了
        resolve(valid);
      });
    });
  };

父组件.ts

通过promise.all()同时校验所有组件,通过的话就提交表单

  /**
   * @function validateBasic
   * @description 校验基础表单
   */
  const validateBasic = () => {
    return new Promise((resolve: any) => {
      base.formRef &&
        base.formRef.validate((valid: any) => {
          resolve(valid);
        });
    });
  };
  
  /**
   * @description 点击保存按钮
   */
  const save = () => {
    const asyncTask = [
      validateBasic(), // 
      base.financeInfoRef && base.financeInfoRef.validateForm(), // 通过ref拿到子组件下的校验方法
      base.scenceFeeRef && base.scenceFeeRef.validateForm(),
    ];
    Promise.all(asyncTask).then((validArr: Array) => {
      // 三张表都校验通过-我用的组件校验成功会valid是underfined,根据自己的组件判断校验结果
      if (validArr.every((item: any) => item == void 0)) {
        submit();
      } else {
        Message.warning('请检查表单,有未通过的表单项');
      }
    });
  };
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中,可以使用Element UI实现多个表单校验。 首先,我们需要安装Element UI库,并在Vue组件中引入所需的表单组件。 ```bash npm install element-plus ``` 然后,在Vue组件中引入Element UI库和所需的表单组件。 ```vue <template> <el-form ref="form" :model="formData" :rules="formRules"> <el-form-item label="姓名" prop="name"> <el-input v-model="formData.name"></el-input> </el-form-item> <el-form-item label="年龄" prop="age"> <el-input v-model="formData.age"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="validateForm">提交</el-button> </el-form-item> </el-form> </template> <script> import { ref } from 'vue'; import { ElForm, ElFormItem, ElInput, ElButton } from 'element-plus'; export default { components: { ElForm, ElFormItem, ElInput, ElButton, }, setup() { const formData = ref({ name: '', age: '', }); const formRules = ref({ name: [ { required: true, message: '请输入姓名', trigger: 'blur' }, ], age: [ { required: true, message: '请输入年龄', trigger: 'blur' }, { type: 'number', message: '年龄必须是数字', trigger: 'blur' }, { min: 18, max: 100, message: '年龄必须在18到100之间', trigger: 'blur' }, ], }); const validateForm = () => { // 触发表单校验 ref.$refs.form.validate((valid) => { if (valid) { // 表单校验通过,可以进行提交操作 console.log('表单校验通过'); } else { // 表单校验失败,无法提交 console.log('表单校验失败'); } }); }; return { formData, formRules, validateForm, }; }, }; </script> ``` 上述代码中,使用了`ElForm`、`ElFormItem`、`ElInput`和`ElButton`这些Element UI的表单组件来实现多个表单校验。这里定义了两个表单项"姓名"和"年龄",分别设置了校验规则。通过点击提交按钮时,调用`validateForm`方法来触发表单校验,并根据校验结果进行相应的操作。 以上就是在Vue3中使用Element UI实现多个表单校验的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值