动态循环表单+动态判断表单类型+动态判断表单是否必填方法

页面效果:

接口请求到的数据格式:

        list: [{demandType: "设备辅助功能要求",demandSettingList: [{id: "1907384788664963074",name: "测试表单",fieldType: 0,contentValue: "",vaildStatus: 0, // 0 非必填;1 必填}]},{demandType: "与产品接触部件要求",demandSettingList: [{id: "1907384788648185858",name: "需求背景",fieldType: 0,contentValue: "",vaildStatus: 1}]},]

模版代码:

            <div v-for="(item,index) in list" :key="index"><el-form :inline="true" :model="item" :ref="'form' + index" label-width="100px"><div class="demand-type">{{ item.demandType }}</div><div v-for="(itm,index2) in item.demandSettingList" :key="index2"><!-- fieldType: 0---文本类型表单 --><el-form-item :label="itm.name" v-if="itm.fieldType === 0" :prop="'demandSettingList.' + index2 + '.contentValue'" :rules="{ required: itm.vaildStatus === 1, message: itm.name + '不能为空', trigger: 'blur' }"><el-input v-model="itm.contentValue" placeholder="请输入" style="width:200px"></el-input></el-form-item><!-- fieldType: 1---数字类型表单 --><el-form-item :label="itm.name" v-if="itm.fieldType === 1" :prop="'demandSettingList.' + index2 + '.contentValue'" :rules="{ required: itm.vaildStatus === 1 }"><el-input-number v-model="itm.contentValue" :min="1" style="width:200px"></el-input-number></el-form-item><!-- fieldType: 2---日期类型表单 --><el-form-item :label="itm.name" v-if="itm.fieldType === 2" :prop="'demandSettingList.' + index2 + '.contentValue'" :rules="{ required: itm.vaildStatus === 1 }"><el-date-picker v-model="itm.contentValue" type="date" placeholder="请选择日期"format="yyyy-MM-dd" value-format="yyyy-MM-dd" style="width:200px"></el-date-picker></el-form-item><!-- fieldType: 3---时间类型表单 --><el-form-item :label="itm.name" v-if="itm.fieldType === 3" :prop="'demandSettingList.' + index2 + '.contentValue'" :rules="{ required: itm.vaildStatus === 1 }"><el-date-picker v-model="itm.contentValue" type="datetime" style="width:200px"format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" placeholder="选择时间"></el-date-picker></el-form-item><!-- fieldType: 4---人员单选类型表单 --><el-form-item :label="itm.name" v-if="itm.fieldType === 4" :prop="'demandSettingList.' + index2 + '.contentValue'" :rules="{ required: itm.vaildStatus === 1 }"><el-select v-model="itm.contentValue" filterable remote placeholder="请选择" style="width:200px"@focus="userFoucs" :remote-method="remoteMethod" :loading="loadingSearch"><el-option v-for="it in searchUserList" :key="it.id" :label="`${it.realName}(${it.account})`":value="it.id"></el-option></el-select></el-form-item><!-- fieldType: 5---人员多选类型表单 --><el-form-item :label="itm.name" v-if="itm.fieldType === 5" :prop="'demandSettingList.' + index2 + '.contentValue'" :rules="{ required: itm.vaildStatus === 1 }"><el-select v-model="itm.contentValue" filterable remote placeholder="请选择" style="width:200px"multiple collapse-tags @focus="userFoucs" :remote-method="remoteMethod" :loading="loadingSearch"><el-option v-for="it in searchUserList" :key="it.id" :label="`${it.realName}(${it.account})`":value="it.id"></el-option></el-select></el-form-item></div></el-form></div><div style="text-align: center;display: block;" v-if="rightFormList.length != 0"><el-button type="primary" @click="submitForm()" :loading="loadingBtn">确定</el-button></div>

提交时的校验方法:

        submitForm() {this.$nextTick(() => {const formRefs = Object.values(this.$refs).flat().filter(ref => ref && typeof ref.validate === "function"); // 过滤非 el-form 组件if (formRefs.length === 0) {console.warn("未找到任何 el-form 组件,请检查 v-for 绑定的 ref 是否正确");return;}Promise.all(formRefs.map(form => form.validate())).then(() => {this.loadingBtn = false;let list = [];this.rightFormList.forEach(item => {item.demandSettingList.forEach(itm => {list.push(itm);});});return api.queryProjectDemandSettingUpdate(list, this.uuId);}).then(() => {this.$message.success('操作成功!');this.getRightList();this.getUuid();}).catch(() => {this.loadingBtn = false;this.$message.warning("请完整填写必填信息!");});});},

📌 总结

📢 代码执行流程

  1. 使用 this.$nextTick() 确保 this.$refs 获取到最新的 el-form 组件

  2. 收集 this.$refs 里的 el-form 组件,并确保 .validate() 方法存在

  3. Promise.all() 让所有表单执行 .validate()

    • 如果全部校验通过,调用 API 提交数据。

    • 如果有未填写的必填项,则提示用户补充信息。

🛠 可能的问题

validate is not a function

原因

  • this.$refs["form" + index] 可能是 数组undefined

  • 解决方案

    • 使用 this.$refs["form" + index][0] 或者 遍历 this.$refs 过滤非 el-form 组件(即代码里 .filter(ref => typeof ref.validate === "function") 部分)。

❌ 提交后还是提示“请完整填写必填信息”

可能原因

  • el-form-item:prop 绑定错误,导致 validate() 无法正确校验。

  • v-model 绑定的 contentValue 可能是 undefined,导致 required 校验失败。

检查方案

  1. 确保 el-form-item:prop 写对:

    <el-form-item :prop="'demandSettingList.' + index2 + '.contentValue'"
  2. 确保 itm.contentValue 初始值是 ""null(不要是 undefined)。

至此完成!!!

测试有效!!!感谢支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯DFS算法题(java)

最大连通 链接&#xff1a; https://www.lanqiao.cn/problems/2410/learning/ 问题描述 小蓝有一个 30 行 60 列的数字矩阵&#xff0c;矩阵中的每个数都是 0 或 1 。 1100100000111111101010010010011010101110110110111010011111100100000000010100011011000000100101100011…

解锁物种分布模拟新技能:MaxEnt 模型与 R 语言的奇妙融合

技术点目录 第二章、常用数据检索与R语言自动化下载及可视化方法第三章、R语言数据清洗与特征变量筛选第四章、基于ArcGIS、R数据处理与进阶第五章、基于Maxent的物种分布建模与预测第六章、基于R语言的模型参数优化第七章、物种分布模型结果分析与论文写作 —————————…

三轴云台之相机技术篇

一、结构设计 三轴云台通常由空间上三个互相垂直的框架构成&#xff0c;包括内框&#xff08;俯仰框&#xff09;、中框&#xff08;方位框&#xff09;和外框&#xff08;横滚框&#xff09;。这些框架分别负责控制相机的俯仰运动、方位运动和横滚运动&#xff0c;从而实现对目…

全文 - MLIR Toy Tutorial Chapter 3 :高层次上语言特定的分析和变换

使用 C 风格的模式匹配和重写来优化转置运算 使用 DRR 优化 reshape 运算 创建一种贴近输入语言的语义表示的方言&#xff0c;可以在 MLIR 中分析、变换和优化&#xff0c;这些过程中需要用到高级语言的信息&#xff0c;而且通常是在语言的 AST 上执行的这些过程。…

js逆向入门图灵爬虫练习平台 第四题学习

(base64解码&#xff09;地址:aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvNC8 先找到请求接口带有加密参数&#xff1a; 全局搜索Sign,找到参数生成位置 看到这就一目了然塞&#xff0c;知道参数是怎么构造生成的&#xff0c;不知道这段 JavaScript 代码没关系…

【Flask开发】嘿马文学web完整flask项目第2篇:2.用户认证,Json Web Token(JWT)【附代码文档】

教程总体简介&#xff1a;2. 目标 1.1产品与开发 1.2环境配置 1.3 运行方式 1.4目录说明 1.5数据库设计 2.用户认证 Json Web Token(JWT) 3.书架 4.1分类列表 5.搜索 5.3搜索-精准&高匹配&推荐 6.小说 6.4推荐-同类热门推荐 7.浏览记录 8.1配置-阅读偏好 8.配置 9.1项目…

[dp5_多状态dp] 按摩师 | 打家劫舍 II | 删除并获得点数 | 粉刷房子

目录 1.面试题 17.16. 按摩师 题解 2.打家劫舍 II 题解 3.删除并获得点数 题解 4.粉刷房子 题解 一定要有这样的能力&#xff0c;碰到一个新题的时候&#xff0c;可以往之前做过的题方向靠&#xff01; 打家劫舍问题模型: 不能选择相邻的两个数&#xff0c;并且要最终…

基于javaweb的SSM羽毛球会员俱乐部系统场馆课程运动设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

windows下git bash安装SDKMan报错Looking for unzip...Not found

需要在jdk8和jdk17两个版本切换。最简单的是通过手动切换&#xff0c;但切换过程太繁琐&#xff0c;修改环境变量&#xff0c;达到切换目的。于是尝试其它解决方案&#xff0c;最终确实使用sdkman工具。 确保安装了git Git - Downloading Package 记住安装的路径&#xff0c;…

rnn的音频降噪背后技术原理

rnniose: 这个演示展示了 RNNoise 项目&#xff0c;说明了如何将深度学习应用于噪声抑制。其核心理念是将经典的信号处理方法与深度学习结合&#xff0c;打造一个小巧、快速的实时噪声抑制算法。它不需要昂贵的 GPU —— 在树莓派上就能轻松运行。 相比传统的噪声抑制系统&…

剑指Offer(数据结构与算法面试题精讲)C++版——day3

剑指Offer&#xff08;数据结构与算法面试题精讲&#xff09;C版——day3 题目一&#xff1a;数组中和为0的3个数字题目二&#xff1a;和大于或等于k的最短子数组题目三&#xff1a;乘积小于k的子数组 题目一&#xff1a;数组中和为0的3个数字 前面我们提到&#xff0c;在一个排…

全新UI好看404页面源码

源码介绍 全新UI好看404页面源码,源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行 效果预览 源码获取 全新UI好看404页面源码

递归典例---汉诺塔

https://ybt.ssoier.cn/problem_show.php?pid1205 #include<bits/stdc.h> #define endl \n #define pii pair<int,int>using namespace std; using ll long long;void move(int n,char a,char b,char c) // n 个盘子&#xff0c;通过 b&#xff0c;从 a 移动到 …

php的高速缓存

部署方法 在我们安装的nginx中默认不支持memc和srcache功能&#xff0c;需要借助第三方模块来让nginx支持此功能。 tar zxf srcache-nginx-module-0.33.tar.gz tar zxf memc-nginx-module-0.20.tar.gz 下载这俩个模块&#xff0c;然后编译安装的时候加进去 编译安装完成之后…

视频设备轨迹回放平台EasyCVR打造视频智能融合新平台,驱动智慧机场迈向数字新时代

一、行业背景​ 随着 5G、AI、物联网、大数据等前沿技术的不断更新换代&#xff0c;交通行业进入数字化转型的高速发展时期。航空业作为交通领域的重要部分&#xff0c;数字化进程从追求速度往注重质量的转变。但机场在数字化转型中面临许多严峻挑战&#xff0c;如现有运营模式…

【论文阅读】Anchor Graph Network for Incomplete Multiview Clustering

摘要 近年来&#xff0c;不完全多视图聚类&#xff08;IMVC&#xff09;受到广泛关注。然而&#xff0c;现有研究仍然存在以下几个不足之处&#xff1a;1) 部分方法忽略了样本对在全局结构分布中的关联性&#xff1b;2) 许多方法计算成本较高&#xff0c;因此无法应用于大规模…

15. 远程服务器运行jemter的GUI方式

1. 问题 在 linux 服务器或远程服务器上&#xff0c;安装 Jmeter&#xff0c;打不开 Jmeter 的 GUI 界面。 环境&#xff1a; linux 服务器mac 电脑 需求&#xff1a;在远程服务器中&#xff0c;启动 jmeter&#xff08;./bin/jmeter &&#xff09;后&#xff0c;在 ma…

Ansible:playbook的高级用法

文章目录 1. handlers与notify2. tags组件3. playbook中使用变量3.1使用 setup 模块中变量3.2在playbook 命令行中定义变量3.3在playbook文件中定义变量3.4使用变量文件3.5主机清单文件中定义变量主机变量组&#xff08;公共&#xff09;变量 1. handlers与notify Handlers&am…

什么是msvcp140.dll?msvcp140.dll丢失的解决方法又有哪些?

msvcp140.dll 是 Microsoft Visual C Redistributable 的核心动态链接库文件&#xff0c;许多软件和游戏依赖它来运行。当系统提示“msvcp140.dll丢失”时&#xff0c;意味着该文件无法被正确加载&#xff0c;导致程序崩溃或无法启动。本文将提供最全面的 msvcp140.dll丢失的解…

(九)图形管线

一图说明问题 顶点数据->顶点着色器->细分着色器->几何着色器->光栅化->片元着色器->颜色混合 创建图形管线函数放在后面位置 void MyApplication::initVulkan() { createInstance(); createSurface(); pickPhysicalDevice(); createLogicalDevice(); cre…