Vue3动态生成form表单校验遇到的问题。获取表单ref值是null。

项目是基于vue3的项目,需求是点击添加按钮弹出modal对话框,对话框内是form表单,通过添加按钮动态添加表单然后提交。
遇到的问题:点击提交按钮需要校验所有表单项的必填项;
思路:1、先声明一个数组接收校验结果;
2、再遍历每个动态生成的表单并触发表单自带的validate方法并放到事先声明的数组中;
3、再用Promise.all方法校验数组中的结果是否全部通过;

//声明数组
let res = []
//遍历
    for (let i = 0; i < dataList.value.length; i++) {
    //结果加到数组中
      res.push(formRef[i].validate())
    }
    //校验
    Promise.all(res).then(()=>{
    //提交动作
})

但是触发事件时会报错找不到validate方法,打印formRef结果显示value是null

解决方案:
1、在dataList数据中加入一个字段el;
2、动态给form表单绑定ref值 :ref="el => (item.el = el)"
3、通过el属性可以拿到validate方法

let res = []
    for (let i = 0; i < dataList.value.length; i++) {
      res.push(dataList.value[i].el.validate())
    }

4.6日更新一波,
上线后出现问题,当删除除了最后一条之外的的动态生成的表单时候,el会变成null导致报错,什么原因造成暂时没找到答案,只能用另一种方法进行校验。。

 for (let i = 0; i < dataList.value.length; i++) {
      let item = dataList.value[i]
      //这里判断每个生成的表单内的必填项是否为空
      if (!item.paymentMilepostName || !item.money || !item.planPaymentTime) {
        return
      }
    }

通过遍历每一个生成的表单内的必填项是否为空,然后再进行提示这种方法也能达到效果。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在 Vue 3 中使用 Ant Design VueForm 表单组件进行确认密码校验,你可以自定义校验规则来实现。下面是一个示例: ```vue <template> <a-form ref="form" :model="formData"> <a-form-item label="密码" name="password" rules="required"> <a-input type="password" v-model="formData.password" /> </a-form-item> <a-form-item label="确认密码" name="confirmPassword" rules="required,checkPassword"> <a-input type="password" v-model="formData.confirmPassword" /> </a-form-item> <a-form-item> <a-button type="primary" @click="submitForm">提交</a-button> </a-form-item> </a-form> </template> <script> import { ref } from 'vue'; import { Form, Input, Button, message } from 'ant-design-vue'; export default { components: { 'a-form': Form, 'a-form-item': Form.Item, 'a-input': Input, 'a-button': Button }, setup() { const formRef = ref(null); const formData = ref({ password: '', confirmPassword: '' }); const checkPassword = (_, value) => { if (value !== formData.password) { return Promise.reject(new Error('两次密码输入不一致')); } return Promise.resolve(); }; const submitForm = () => { formRef.value.validate((valid) => { if (valid) { // 验证通过,执行表单提交操作 console.log('表单验证通过'); // ... } else { console.log('表单验证失败'); } }); }; return { formRef, formData, checkPassword, submitForm }; } }; </script> ``` 在上述示例中,我们在确认密码字段的 `a-form-item` 组件上定义了一个名为 `checkPassword` 的校验规则。该规则使用了一个自定义校验函数,并在函数内部判断确认密码是否与密码字段的相同。如果不相同,我们使用 `Promise.reject` 返回一个错误信息,表示校验失败;如果相同,我们使用 `Promise.resolve` 表示校验通过。 然后,我们将这个校验规则 `checkPassword` 应用到确认密码字段的 `rules` 属性中,通过逗号分隔多个规则。注意,我们还将 "required" 规则也应用到了确认密码字段上,以确保确认密码不能为空。 在 `submitForm` 方法中,我们使用 `formRef.value.validate` 方法来进行表单验证,当验证完成后执行回调函数。你可以在回调函数中处理验证通过和验证失败的情况。 希望以上信息对你有帮助!如果你还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

屎山制造者2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值