el-form中使用v-model和prop实现动态校验

news/2024/9/18 12:31:30/ 标签: vue.js, javascript, 前端

如何在Vue的el-form中使用v-model和prop实现动态校验,包括多个变量控制校验、数组循环校验和字段级条件显示。通过实例演示了如何配合rules和自定义验证函数来确保表单的完整性和有效性。

 

公式: 动态校验项的v-model的绑定值 = el-form的属性 :model的值 + '.' + :prop属性的值
以此反推 :prop属性的值
此公式适应与element、element-plus、ant-design-vue组件库的表单校验

场景:本文是三种表单校验
1.多个变量控制某一项校验
2.对于数组for循环,校验每一项
3.对于两个不同的字段,分别v-if显示隐藏的校验

 

 1. required: true 会有 * , 但仅是触发最后点击提交按钮时,校验某一项位必填;与输入事件或者选择或者失焦时候 怎么校验无关 (这时候的校验取决于是否写了具体的校验规则)为false则提交时可不填(默认false) 但是同时取决于validator的callback()返回是空还是返回报错提示
.
2.触发哪一条规则的校验和如何触发校验?
(1)触发哪一条规则的校验:
        a、如果该el-form-item绑定了具体某个:rules=“rules.abc”,则触发abc的规则
        b、默认取决于该el-form-item所绑定的prop字段,需要注意的是该prop属性在rules里必须要有,但是在form表单绑定的formData大对象里可有可无。
(2)如何触发该条校验:

取决于一级el-form-item下的子元素里的所有有的绑定了formData变量的元素和对应的trigger事件触发(所以可以多个输入框或选择框触发一项的校验事件)。需要注意该一级el-form-item下的子元素如果也包含了二级el-form-item和对应其他的prop,那么二级的el-form-item和对应其他的prop下的绑定变量和事件仅仅会触发二级自己的校验,而不会触发到一级的事件

一、多个变量控制某一项校验。

 

 简单代码:重点在于prop="zdxx"自定义绑定自定义校验事件

    <el-form v-loading="loading" ref="ruleFormRef" :model="formData" :rules="rules" label-width="160px"class="demo-ruleForm" :size="'default'" status-icon><el-row :gutter="24"><el-col :span="12"><el-form-item label="云主机名称:" prop="virtualMachineName"><el-input placeholder="请输入" clearable /></el-form-item></el-col><el-col :span="24"><el-form-item label="站点信息:" prop="zdxx"><el-col :span="12"><el-checkbox :disabled="formData.applyVirtualMachineType === 2"v-if="canEdit && formData.applyVirtualMachineType !== 2" v-model="formData.supportSiteAFlag" label="主调"size="large" @change="changeCheckbox('siteAIp')" /><el-checkbox disabled v-else v-model="formData.supportSiteAFlag" label="主调" size="large" /></el-col><el-col :span="12"><el-checkbox :disabled="formData.applyVirtualMachineType === 2"v-if="canEdit && formData.applyVirtualMachineType !== 2" v-model="formData.supportSiteBFlag" label="备调"size="large" @change="changeCheckbox('siteBIp')" /><el-checkbox disabled v-else v-model="formData.supportSiteBFlag" label="备调" size="large" /></el-col><el-col :span="12"><template v-if="formData.supportSiteAFlag"><el-form-item prop="siteAIp"><el-input :disabled="formData.applyVirtualMachineType === 2"v-if="canEdit && formData.applyVirtualMachineType !== 2" v-model="formData.siteAIp" placeholder="请输入"clearable /><span v-else>主调IP:<span class="ml">{{ formData.siteAIp }}</span></span></el-form-item></template></el-col><el-col :span="12"><template v-if="formData.supportSiteBFlag"><el-form-item prop="siteBIp"><el-input :disabled="formData.applyVirtualMachineType === 2"v-if="canEdit && formData.applyVirtualMachineType !== 2" v-model="formData.siteBIp" placeholder="请输入"clearable /><span v-else>备调IP:<span class="ml">{{ formData.siteBIp }}</span></span></el-form-item></template></el-col></el-form-item></el-col></el-row></el-form>let formData = ref({virtualMachineName: undefined,// zdxx: [],supportSiteAFlag: false,siteAIp: undefined,supportSiteBFlag: false,siteBIp: undefined,
})const isSite = (rule, value, callback) => {if (!formData.value.supportSiteAFlag && !formData.value.supportSiteBFlag) {callback(new Error('请选择站点信息'))} else {callback()}
}const rules = reactive({virtualMachineName: [{ required: true, message: '请输入云主机名称', trigger: 'blur' },],zdxx: [{ required: true, validator: isSite, trigger: 'change' },],// supportSiteAFlag: [{ required: true, validator: isSite, trigger: 'change' },],siteAIp: [{ validator: isIp1, trigger: 'blur' },],// supportSiteBFlag: [{ required: true, message: '请选择备调', trigger: 'change' },],siteBIp: [{ validator: isIp2, trigger: 'blur' },],
})

二、新增和删除表单项,动态校验。

el-form表单动态动态新增表单进行校验。直接参考 动态增减表单项

以下代码可直接复制:重点在于:prop :rules :key。
公式: 动态校验项的v-model的绑定值 = el-form的属性 :model的值 + '.' + :prop属性的值

根据公式倒推 :prop
例如:v-model=“domain.premium” 就是 dynamicValidateForm.premiumList[index].premium ,而且:model=“dynamicValidateForm”
所以得到 :prop = ‘premiumList.’ + index + ‘.premium’

<template><div><el-form :model="dynamicValidateForm" ref="dynamicValidateForm" label-width="110px" class="demo-dynamic"><div class="bor_box" v-for="(domain, index) in dynamicValidateForm.premiumList" :key="domain.key"><el-col :span="24"><div class="box4_div"><el-col :span="5"><el-form-item label="保费:" :prop="'premiumList.' + index + '.premium'" :rules="{required: true, message: '保费不能为空', trigger: 'blur'}"><el-input class="num_input" placeholder="请输入" v-model="domain.premium"></el-input></el-form-item></el-col><el-col :span="5"><el-form-item label="保费率:" :prop="'premiumList.' + index + '.rate'" :rules="{required: true, message: '保费率不能为空', trigger: 'blur'}"><el-input class="num_input" placeholder="请输入" :precision="2" :step="0.01" v-model="domain.rate"></el-input></el-form-item></el-col><el-col :span="5"><el-form-item label="上游费用率:" :prop="'premiumList.' + index + '.feeRate'" :rules="{required: true, message: '上游费用率不能为空', trigger: 'blur'}"><el-input class="num_input" placeholder="请输入" :max="100" v-model="domain.feeRate"></el-input></el-form-item></el-col><el-col :span="5"><el-form-item label="上游费用额:" :prop="'premiumList.' + index + '.fee'" :rules="{required: true, message: '上游费用额不能为空', trigger: 'blur'}"><el-input class="num_input" placeholder="请输入" v-model="domain.fee"></el-input></el-form-item></el-col><el-col :span="4"><el-button @click.prevent="removeDomain(domain,index)">删除</el-button></el-col></div></el-col></div><div><el-form-item><el-button type="primary" @click="submitForm('dynamicValidateForm')">提交</el-button><el-button @click="addDomain">添加保费</el-button><el-button @click="resetForm('dynamicValidateForm')">重置</el-button></el-form-item></div></el-form></div>
</template><script>
export default {data () {return {dynamicValidateForm: {premiumList: [{selected: 'Y', premium: undefined, rate: undefined, feeRate: undefined, fee: undefined, baofei1_unit: '', shangyoufeiyonge_unit: '', downRate: undefined, downFee: undefined, xiayoufeiyonge_unit: '',}],},}},created () {},methods: {submitForm (formName) {this.$refs[formName].validate((valid) => {if (valid) {alert('submit!')} else {console.log('error submit!!')return false}})},resetForm (formName) {this.$refs[formName].resetFields()},removeDomain (item, index) {if (index !== 0) {this.dynamicValidateForm.premiumList.splice(index, 1)}},addDomain () {this.dynamicValidateForm.premiumList.push({selected: 'N', premium: undefined, rate: undefined, feeRate: undefined, fee: undefined, baofei1_unit: '', shangyoufeiyonge_unit: '', downRate: undefined, downFee: undefined, xiayoufeiyonge_unit: '',key: Date.now()})},},
}
</script><style lang="less" scoped>
.bor_box {margin-left: 50px;margin-bottom: 10px;overflow: hidden;
}
</style>

三、el-form表单校验v-if不生效、el-form表单校验v-show不生效:

例如有个表单项,通过控制显示两个不同的表单项内容,分别需要校验对应的表单项即可。
如果是直接用v-if,会发现切换时候,校验不生效;
如果直接使用v-show,又发现即使不切换,隐藏了另外的表单项,也会触发校验规则。
正确做法是:使用v-if控制表单项的显示隐藏,同时需要给el-form-item加上自己的 prop=" " 和 key=" " ,这样才能区分。当然:rules 也要有自己对应的提示。

    <template v-if="flag"><el-form-item label="姓名:" prop="name" key="name" :rules="rules.name"><el-input v-model="formData.name" placeholder=""></el-input></el-form-item></template><template v-else><el-form-item label="退回原因:" prop="desc" key="desc" :rules="rules.desc"><el-input type="textarea" maxlength="500" show-word-limit v-model="formData.desc" placeholder="请填写退回原因"></el-input></el-form-item></template>

 


http://www.ppmy.cn/news/1516523.html

相关文章

SystemTap(stap)架构和原理介绍,以及脚本编写举例

1 SystemTap简介 SystemTap是一个诊断Linux系统性能或功能问题的开源工具。它允许开发人员和系统管理员深入研究内核甚至用户空间应用程序的行为&#xff0c;以便发现错误状态、性能问题&#xff0c;或者仅仅为了解系统是如何工作的。它使得对运行时的Linux系统进行诊断调式变…

Windows安装Tomcat10

1. 下载Tomcat Tomcat官网 https://tomcat.apache.org/download-10.cgi ​下载安装jdk17 &#xff1a;jdk-17_windows-x64_bin.exe 配置JAVA环境变量 JAVA_HOME&#xff1a;C:\Program Files\Java\jdk-17 PATH&#xff1a;%Java_Home%\bin;%Java_Home%\jre\bin; 2. 设置环境变…

【13.3 python中的高级文件操作】

python中的高级文件操作 在Python中&#xff0c;除了基本的文件读写和目录操作外&#xff0c;还有一些高级的文件和目录操作&#xff0c;如删除文件、重命名文件和目录、以及获取文件的基本信息等。这些操作通常通过os模块和pathlib模块来实现。下面我将详细介绍这些操作&#…

电脑换硬盘怎么全盘克隆?轻松实现数据迁移

随着科技的不断发展&#xff0c;电脑硬盘的存储容量和读写速度也在不断提升。为了获得更好的电脑使用体验&#xff0c;许多用户会选择更换更大容量、更高效的硬盘。然而&#xff0c;在更换硬盘的过程中&#xff0c;一个关键的问题摆在了我们面前&#xff1a;如何将旧硬盘中的所…

物联网---ESP32

物联网---ESP32 一、TCP/IP协议(互联网协议)二、MQTT协议(通信协议)2.1 MQTT基本原理2.2 连接MQTT服务端 三、ESP323.1 ESP介绍3.2 ESP32连接云端3.2.1 ESP32连接WIFI/MQTT3.2.2 OneNET云端 一、TCP/IP协议(互联网协议) TCP/IP是一组用于互联网及其他网络中数据传输的通信协议…

hutool工具类JSONUtil无法映射全是大写的单词,如何解决

背景 在解析第三方接口数据时&#xff0c;发现有的字段数据没有映射到对应的字段上&#xff0c;还有对于有的字段有空格或换行&#xff0c;也会一同存入数据库。 示例 实体类&#xff1a; public class Goods { private String id;private String unit;private Integer US…

HexView 刷写文件脚本处理工具-命令行介绍(八)-文件合并(/MO /MT)

介绍 /MO 和 /MT 参数:用于将一个或多个文件合并到程序的内部数据存储中。文件读取:使用第2.2.1.2.1节中描述的自动检测文件类型机制来读取文件。合并操作类型:需要选择合并操作的类型。可以选择透明模式(/MT)或不透明模式(/MO),两者不能混合使用。透明模式(/MT):加载的文…

黑神话悟空无法登录服务器怎么办

黑神话悟空游戏在登录的时候会遇到无法登录服务器的问题&#xff0c;玩家可以采用一些有效的方法进行解决&#xff0c;其中最主要的措施就是优化网络环境和减少网络干扰。Rak小编为您整理黑神话悟空无法登录服务器如何解决的步骤及注意事项。 优化网络环境 1、当游戏无法登录服…

使用notepad++将shell脚本转为UNIX格式方法(主要差别在换行符)

sh文件尽量在linux上改&#xff0c;因windows和linux换行符不同&#xff0c;在windows上改后&#xff0c;在linux上改可能会出现换行符错误。 windows换行符 linux换行符 windows环境改换行符方法 使用notepad点 编辑–》文档格式转换–》转换未unix格式。 注&#xff1a;tx…

搭建ELK-Filebeat采集系统日志

1、解压到/data/elk/filebeat mkdir -p /data/elk/filebeat tar -zxf filebeat-7.17.7-linux-x86_64.tar.gz -C /data/elk/filebeat --strip-components1 #--strip-components选项表示从目录级别上去除指定的前缀&#xff0c;以实现更加控制解压的效果 2、修改配置文件 vi /…

【长文细说】20个ElementPlus核心组件以及使用技巧

Element Plus 是一个基于 Vue 3 和 Vite 的组件库&#xff0c;它提供了一套丰富的 UI 组件&#xff0c;用于构建高质量的网页应用程序。Element Plus 是 Element UI 的 Vue 3 版本&#xff0c;Element UI 是一个广泛使用的 Vue 2 组件库。Element Plus 继承了 Element UI 的设计…

Qt5.14.2 操作PostgreSQL 记录

在Qt5.14.2中操作PostgreSQL数据库. #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> #include <QDebug>// 初始化数据库连接QSqlDatabase db QSqlDatabase::addDatabase("QPSQL");//qDebug() << "aaaa&qu…

构建第一个zk

1 必要步骤 视频学习&#xff1a;5. Circcom 中的基本算术电路_哔哩哔哩_bilibili 文字学习&#xff1a;https://hackmd.io/YlNLZS2ESI21OSqdTW_mPw/S1jqN-h80/edit 第五课&#xff0c;circom实践&#xff0c;需要安装 1 vscode 2 rust&#xff1a;Windows安装Rust环境&…

FFmpeg 实现从设备端获取音视频流并通过RTMP推流

使用FFmpeg库&#xff08;版本号为&#xff1a;4.4.2-0ubuntu0.22.04.1&#xff09;实现从摄像头和麦克风获取音视频流并通过RTMP推流。 RTMP服务器使用的是SRS&#xff0c;我这边是跑在Ubuntu上的&#xff0c;最好是关闭掉系统防火墙&#xff0c;不然连接服务器好像会出问题&a…

python手写了个简易的豆瓣影评爬虫

使用python手写了个简易的豆瓣影评爬虫代码。 __author__ wsximport time import requests from bs4 import BeautifulSoup import os import re import uuiddef clean_windows_filename(string_file_name):invalid_chars r[\\/:*?"<>|]return re.sub(invalid_c…

ZooKeeper 的特性及其在分布式系统中的配置中心的应用

以下是配置管理和服务注册的实现方式&#xff1a; 1. 配置管理 配置管理指的是将系统中各个组件的配置信息集中管理&#xff0c;以便动态更新和统一配置。ZooKeeper 可以用来管理配置文件&#xff0c;通过它的节点结构和数据一致性功能&#xff0c;确保所有客户端都能获得最新…

PIL convert(‘RGB‘) 用法

PIL 不提供 BGR转RGB的方法。 1. 图像模式转换 如果图像当前的模式不是 RGB&#xff0c;例如它是灰度&#xff08;L&#xff09;、CMYK 或其他模式时&#xff0c;convert(RGB) 会将图像转换为 RGB 格式。 灰度图像 (L)&#xff1a; 如果图像是灰度图像 (L)&#xff0c;conver…

【机器学习工具库-一-传统机器学习sklearn库】

sklearn库 安装安装顺序 sklearn库的六大功能sklearn中的核心调用流程 sklearn库是用于机器学习一个工具包&#xff0c;有了它&#xff0c;可以帮我们用简单的函数实现传统机器学习中的分类、聚类等任务。 安装 sklearn的官网 http://scikit-learn.org/stable/ sklearn库基于N…

【C++ 面试 - 内存管理】每日 3 题(二)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

Django后端架构开发:Nginx服务优化实践

Django后端架构开发&#xff1a;Nginx服务优化实践 目录 &#x1f31f; Nginx核心概念&#x1f50d; Nginx服务原理&#x1f504; Nginx负载均衡&#x1f517; Nginx反向代理⚙️ Nginx动静分离 &#x1f31f; Nginx核心概念 Nginx作为一款轻量级且功能强大的HTTP服务器&…