vue中多个子组件form表单的校验可以使用Promise.all

当父组件中有多个子组件的form表单都需要校验,父组件点击提交按钮,应该触发每个子组件中的校验方法,等所有的子组件都校验通过,才能提交;
如果每个子组件的校验方法中返回的是Promise,那么父组件则可以使用Promise.all来统一做判断,只有所有的子组件中的Promise都通过,才能提交;
先看看Promise.all方法的使用:

let p1 = new Promise((resolve, reject) => {
  resolve(1)
})
let p2 = new Promise((resolve, reject) => {
  resolve(2)
})
Promise.all([p1, p2]).then(res => {
  console.log("111", res);  // 打印出的是[1,2]
}).catch(error => {
  console.log(error);
})

all方法的参数是一个数组,数组里面放promise对象,只有当数组里面的promise都通过了,才会执行all的then方法,这样就可以对所有的子组件的promise做校验的判断了;
下面看个例子:

<body>
  <div>
    <span>姓名:</span>
    <input type="text" id="ipt1">
  </div>
  <div>
    <span>年龄:</span>
    <input type="text" id="ipt2">
  </div>
  <button onclick="save()">提交</button>
</body>
<script>
  const ipt1 = document.getElementById('ipt1')
  const ipt2 = document.getElementById('ipt2')

  // 假设这是子组件1中定义的方法
  function validate1() {
    return new Promise((resolve, reject) => {
      if (ipt1.value) {
        resolve(true)
      } else {
        console.log(ipt1.value);
        reject(false)
      }
    })
  }

  // 假设这是子组件2中定义的方法
  function validate2() {
    return new Promise((resolve, reject) => {
      if (ipt2.value) {
        resolve(true)
      } else {
        console.log(ipt2.value);
        reject(false)
      }
    })
  }

  // 假设这是父组件中的提交方法
  function save() {
    const p1 = validate1()  // 子组件1中的promise
    const p2 = validate2()  // 子组件2中的promise
    Promise.all([p1, p2]).then((res) => {
      alert('验证通过!')
    }).catch(error => {
      alert('验证不通过!')
    })
  }
</script>
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过在父组件引用组件并调用组件的方法来实现校验组件form表单。 首先,在组件暴露一个校验方法,例如: ```javascript <template> <el-form ref="form" :model="formData" :rules="rules"> <!-- 表单内容 --> </el-form> </template> <script> export default { props: { value: { type: Object, default: () => {} } }, data() { return { formData: this.value, rules: { // 表单校验规则 } } }, methods: { validate() { return new Promise((resolve, reject) => { this.$refs.form.validate(valid => { if (valid) { resolve(this.formData); } else { reject(new Error('表单校验失败')); } }) }) } } } </script> ``` 然后,在父组件引用组件,并调用组件校验方法,例如: ```html <template> <div> <child-component v-model="formData" ref="child"></child-component> <el-button type="primary" @click="validate">校验表单</el-button> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { formData: {}, } }, methods: { async validate() { try { const childFormData = await this.$refs.child.validate(); // 表单校验成功,可以对组件的表单数据进行操作 } catch (error) { // 表单校验失败,可以进行相关处理 } } } } </script> ``` 在父组件,引用组件并调用组件的validate方法可以校验组件的表单,如果校验成功,则返回组件的表单数据,可以对其进行操作;如果校验失败,则可以进行相关处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值