vue3使用ref动态获取组件,并对动态表单组件进行校验

devtools/2024/10/20 20:59:47/

前言

项目开发过程中,遇到一种情况,需要动态加载多个表单,并且在提交时,需要对所有提交的表单进行校验。研究了一些文档,最终完成了需求。首页是动态表单渲染、添加以及删除

1 动态渲染组件

javascript">// 渲染表单列表
div class="form-list"><div class="form-item" v-for="(item, index) in formData.details" :key="index"><div class="item-form"><FormCom:ref="(el) => setBoxRef(el, index)":form-config="formConfig2"label-width="150px":form-rules="formRules2"/></div></div><!-- 添加按钮 --><div class="button-wrapper" @click="addItem"><el-icon style="margin-right: 12px;"><CirclePlus /></el-icon></div>
</div>
javascript"><script lang="ts" setup>
const baseParams = {... // 渲染的参数 }
const boxRefs:any = ref([])
const formData: any = reactive({
...// 其他参数details: [deepClone(baseParams )],
})
// 动态绑定ref
const setBoxRef = (el: any, index:number) => {if (el) {boxRefs.value[index] = el}
}
// 添加
function addItem () {formData.details.push(deepClone(baseParams ))
}
// 删除
function deleteItem (index:number) {formData.details.splice(index, 1)
}
</script>

2. 动态表单校验

实际场景中,我们需要在提交时对所有表单进行一次性校验,并给出校验信息,element的官网示例钟,对form表单的校验方法是

javascript">if (!formEl) returnawait formEl.validate((valid, fields) => {if (valid) {console.log('submit!')} else {console.log('error submit!', fields)}})

显然在这里,对动态表单而言是不行的,我们的表单是动态添加和删除的,我们前面已经可以获取到所有的动态表单组件了,但是你不能一个个去校验,这样在使用上体验感非常不好,所以需要集体校验,并给出结果。然后我想到了promise all,然后尝试处理了一下,就很好的解决了问题

javascript">// 校验所有表单
async function validateForm() {const { details } = formDataconst refList = []for (const index in details) {refList.push(checkForm(boxRefs.value[index]?.formRef))}Promise.all([checkForm(formRef.value?.formRef), ...refList]).then(() => {// 后续操作}).catch(() => {ElMessage.warning('请完善表单必填项')})
}
// 表单校验通用方法function checkForm (formRef) {return new Promise((resolve, reject) => {formRef?.validate((valid) => {if (valid) {resolve()} else {reject(new Error('错误'))}})})
}

最后,大功告成!!!写这篇博客纯粹也是想记录一下自己解决问题的过程和方法,如果能帮助到你,记得点赞+关注哦


http://www.ppmy.cn/devtools/127381.html

相关文章

Spring Boot技术:图书进销存管理的创新实践

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

PHP爬虫:获取商品销量数据的利器

在电子商务的激烈竞争中&#xff0c;掌握商品销量数据是商家洞察市场动态、制定销售策略的关键。通过PHP爬虫技术&#xff0c;我们可以高效地获取这些数据&#xff0c;为商业决策提供支持。 PHP爬虫的优势 PHP作为一种流行的服务器端脚本语言&#xff0c;拥有跨平台运行、丰富…

【前端】如何制作自己的网站(7)

以下内容接上文。 结合图片的超链接 将img元素作为内容&#xff0c;放在a元素中。即可为图片添加一个超链接。 例如右边的代码&#xff0c;点击头像就会打开“aboutme.html“。 点击右边的图片试试&#xff5e; 两个非文本元素——图片与超链接。 从现在开始&#xff0…

Excel:vba实现筛选出有批注的单元格

实现的效果&#xff1a;代码&#xff1a; Sub test() Dim cell As RangeRange("F3:I10000").ClearlastRow Cells(Rows.Count, "f").End(xlUp).Row MsgBox lastrow For Each cell In Range("a1:a21")If Not cell.Comment Is Nothing ThenMsgBox…

PHP中的ReflectionClass常见用法

ReflectionClass是 PHP 中的一个类&#xff0c;它提供了有关类的信息的反射。 使用ReflectionClass可以在运行时获取关于类的各种信息&#xff0c;例如类的名称、方法、属性、注释等。 以下是一些常见的用法&#xff1a; 获取类的名称&#xff1a; $reflection new Reflec…

fastapi的docs页面是空白解决

环境&#xff1a;openEuler、python 3.11.6、fastapi 0.115.2 背景&#xff1a;居家办公&#xff0c;默认搭建的fastapi的docs接口为空白 时间&#xff1a;20241016 说明&#xff1a;网上很多教程的缺点是复杂&#xff08;但是能够了解的更清楚&#xff09;&#xff0c;使用…

[含文档+PPT+源码等]精品基于ssm实现的原生微信小程序线上养花系统的设计与实现

基于SSM&#xff08;Spring、SpringMVC、MyBatis&#xff09;实现的原生微信小程序线上养花系统的设计与实现背景&#xff0c;可以从以下几个方面进行阐述&#xff1a; 一、选题背景 随着人们生活水平的提高和环境保护意识的增强&#xff0c;养花已经成为一种流行的休闲活动。…

6.C++经典实例-计算给定范围内的素数(质数)

所谓素数&#xff08;也称为质数&#xff09;是指大于1的自然数&#xff0c;且只能被1和它本身整除的数。例如&#xff0c;2、3、5、7、11等都是素数。 下面是计算3000内所有的素数的实例 #include <iostream> #include <vector> #include <cmath>// 判断一…