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
      }
    }

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

### Vue3 中 `v-for` 动态表单校验Vue3 和 Element Plus 结合使用的场景下,对于通过 `v-for` 循环生成的动态表单项进行校验,可以采用特定的方式设置 `el-form-item` 的属性来确保每一项都能被正确地验证。 #### 设置 `el-form-item` 属性 为了使每一个由 `v-for` 创建出来的子表单项能够参与整体表单校验逻辑,在创建这些项目时需指定唯一的 `prop` 属性。这可以通过拼接字符串的方式来完成,例如: ```html <template> <el-form :model="dynamicForm" ref="ruleFormRef"> <div v-for="(item, index) in dynamicForm.items" :key="index"> <!-- 使用索引来构建唯一路径 --> <el-form-item :label="&#39;Item &#39; + (index + 1)" :prop="&#39;items.&#39; + index + &#39;.value&#39;" :rules="formRules.itemValueRule"> <el-input v-model="item.value"></el-input> </el-form-item> </div> </el-form> </template> ``` 上述代码片段展示了如何利用模板语法中的表达式为每个迭代元素分配独特的 `prop` [^2]。这样做不仅使得各个字段可以在整个表单上下文中得到识别,同时也允许针对它们应用具体的校验规则。 #### 定义校验规则 接着定义适用于所有重复项目的公共校验规则对象,并将其应用于相应的 `el-form-item` 上: ```javascript <script setup> import { reactive } from "vue"; const ruleFormRef = ref(null); // 表单模型数据结构 let dynamicForm = reactive({ items: [ { value: &#39;&#39; }, // 更多初始条目... ] }); // 校验规则配置 const formRules = { itemValueRule: [{ required: true, message: &#39;请输入内容&#39;, trigger: &#39;blur&#39; }] }; </script> ``` 这段脚本初始化了一个包含多个可编辑域的数据列表,并指定了一个简单的必填项校验条件给所有的输入框。 #### 提交并触发校验 当准备提交表单时,可通过调用 `$refs.ruleFormRef.validate()` 方法来进行完整的表单有效性检查。如果只想单独检验某个特定部分,则应使用 `validateField(field)` 函数传递目标字段名称作为参数[^3]。 ```javascript async function submitForm() { await ruleFormRef.value.validate((valid) => { if (!valid) return; console.log(&#39;Submit!&#39;); }); } ``` 以上就是基于 Vue3 和 Element Plus 对于动态生成表单执行全面或局部校验的一种有效方式[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

屎山制造者2022

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

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

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

打赏作者

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

抵扣说明:

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

余额充值