vue2表单校验:el-form表单绑定数组并使用rules进行校验

news2024/9/22 13:31:47

 前言

vue项目中,大量使用element ui组件中的el-form来构建丰富且具有交互性的表单页面(官网:Element - The world's most popular Vue UI framework)。el-form提供了丰富的表单控件,如输入框、下拉框、日期选择器等,并支持表单校验、表单布局等功能。

其中,表单校验功能使用了async-validator,是一个表单异步校验库,用来检查用户输入是否符合要求,比如必填项是否填写等。官网地址:https://www.npmjs.com/package/async-validator,一个翻译过的blog(相比官网有缺失):https://www.cnblogs.com/web-learn/p/16012789.html

需求

 需要用户填写一系列人员,不设上限,但是至少填写一个。每个人员信息包含人员名称和电话号码

  1. 希望页面“人员”前面添加必填项标识 
  2. 希望检查人员姓名和手机号码是否填写,格式是否符合规范,并给出合理提示

解决方案

1、data中使用数组people接收人员信息

frm:{
    project: "",
    people:[]    
}

 2、template中

2.1 el-form-item直接绑定people

prop="people"

2.2 为整个数组设置rules:

:rules="[message: '请添加人员',trigger: 'blur',required: true}]"

2.3 为数组内的成员对象设置rules:

对于数组中的两个字段,分别设置它们对应的rule,这里要注意,因为用了v-for,为了使检查时能够非常清晰明确地知道是哪一行检查失败,prop需要使用变量::prop="`people[${index}].nickName`"

其中,

  1. prop前面添加冒号:,告知后面的不是普通的字符串,而是表达式;
  2. 表达式使用``符号(不是单引号,而是键盘左上角的反引号,类似于linux中的执行标记吧
  3. 变量index使用${}传递

js中,${}是字符串占位符,被称为模板字符串或者模板字面量。通过在 ${} 中放置变量名或表达式,可以将其值插入到字符串中。

<el-form ref="frm" :model="frm" :rules="rules" label-width="80px">
    <el-form-item label="人员" prop="people"
      :rules="[message: '请添加人员',trigger: 'blur',required: true}]">
      <el-row v-for="(row, index) in frm.people" :key="index">
         <el-col :span="10">
             <el-form-item :prop="`people[${index}].nickName`" :rules="[{required: true,message: '人员姓名不能为空',trigger: 'blur'}]">
                <el-input v-model="frm.people[index].nickName" placeholder="请输入人员姓名"/>
             </el-form-item>
         </el-col>
         <el-col :span="10">
             <el-form-item  :prop="`people[${index}].phonenumber`" :rules="[{required: true,message: '手机号码不能为空',trigger: 'blur'}]">
                 <el-input v-model="frm.people[index].phonenumber" placeholder="请输入手机号码"/>
             </el-form-item>
          </el-col>                      
    </el-form-item>
    ...
</el-form>

半失败的优化尝试

解决方案中,将rules直接写在template中,不满足VUE规范中要求template简洁的要求,所以我尝试了将rules像常规一样集中写在data中,如下:

rules: {        
    people:[
        {     
            message: '请添加人员',
            trigger: 'blur',
            required: true
        }
    ],
    nickName:[{required: true,message: '人员姓名不能为空',trigger: ['blur','change']}],
    phonenumber:[{required: true, pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码'}]
},

然后,在template的el-form-item中移除rules:

<el-form ref="frm" :model="frm" :rules="rules" label-width="80px">
    <el-form-item label="人员" prop="people">
      <el-row v-for="(row, index) in frm.people" :key="index">
         <el-col :span="10">
             <el-form-item :prop="`people[${index}].nickName`">
                <el-input v-model="frm.people[index].nickName" placeholder="请输入人员姓名"/>
             </el-form-item>
         </el-col>
         <el-col :span="10">
             <el-form-item  :prop="`people[${index}].phonenumber`">
                 <el-input v-model="frm.people[index].phonenumber" placeholder="请输入手机号码"/>
             </el-form-item>
          </el-col>                      
    </el-form-item>
    ...
</el-form>

然后发现最外层people数组校验没有问题,但是里面的人员姓名和电话号码校验失败。又根据官网重新修改rules: 

devs:[
       {
         type: 'array',            
         required: true,
         defaultField: {
           type:'object',
           required: true,
           fields: {
             nickName:[{required: true,message: '人员姓名不能为空',trigger: ['blur','change']}],
             phonenumber:[{required: true, pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码'}]
           },
         },
      }
]

可以校验,但是,它无法准确对标是哪一行,而且,两个字段nickName和phonenumber是顺序校验的,比如,姓名和电话都没有填写,它只是提示姓名不能为空,等我填写了姓名之后,才会提示电话不正确。。。。所以,最终又把这两个字段的校验放回到template中实现了。 

总结

1、在el-form中指定rule,可引用data或compute中集中定义的rules,也可以每一条item中单独定义自己的rule

2、另外,花费1天的时间买来的教训:如果rules集中写,在el-form中已经引用了,那么在el-form-item中不能重复引用,否则console中不会报错,但是,rules将不起作用,且提示 people is not a string,即便在rules中添加了 type: 'array' 也不行。

如下写法是错误的。

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

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

相关文章

React原理之Fiber双缓冲

前置文章&#xff1a; React原理之 React 整体架构解读React原理之整体渲染流程React原理之Fiber详解 -----读懂这一篇需要对 React 整体架构和渲染流程有大致的概念 &#x1f60a;----- 在前面的文章中&#xff0c;简单介绍了 Fiber 架构&#xff0c;也了解了 Fiber 节点的…

Python功能强大且易于使用的命令行 shell库之xonsh使用详解

概要 Xonsh 是一种基于 Python 的跨平台、用户友好的命令行 shell。它结合了 Python 和传统 shell 命令的优势&#xff0c;允许用户在同一个环境中使用两者。Xonsh 为开发者和系统管理员提供了强大的工具&#xff0c;简化了任务自动化和脚本编写。本文将详细介绍 xonsh 库&…

基于php网上差旅费报销系统设计与实现

网上报销系统以LAMP(LinuxApacheMySQLPHP)作为平台,涉及到PHP语言、MySQL数据库、JavaScript语言、HTML语言。 2.1 PHP语言简介 PHP&#xff0c;一个嵌套的缩写名称&#xff0c;是英文 “超级文本预处理语言”&#xff08;PHP: Hypertext Preprocessor&#xff09;的缩写。P…

又学了几个新的comfyui小技巧,分享给大家!

前言 掌握一些小技巧&#xff0c;提升效率&#xff01; 1、图像选择器 出图批次是四张&#xff0c;然后想选一张图进入到之后的工作流&#xff0c;就可以用这个节点 默认是这样的 运行到这个节点的时候&#xff0c;会出现四张图片&#xff0c;选中满意的图片&#xff0c;点…

RM惯性测量单元IMU

在Robomaster比赛中&#xff0c;一般各大参赛队会在机器人的云台上搭载IMU&#xff0c;用以反馈云台的yaw轴和pitch轴的角度和角速度。 需要注意的是&#xff0c;尽管依靠云台电机6020的编码器同样可以实现以上数据的获取&#xff0c;但是由于云台控制对于灵敏度和精度的要求比…

微信删除的聊天记录怎么恢复?实测有效,3招教您轻松恢复

微信已成为我们传递信息、分享情感的重要桥梁。然而&#xff0c;不小心误删的聊天记录往往让人懊悔不已&#xff0c;尤其是那些珍贵的对话和重要的信息。面对微信删除的聊天记录怎么恢复的问题&#xff0c;很多人都会感到束手无策。 但别担心&#xff0c;无论您是技术小白还是…

单因子年化23.7%,基于deap的因子挖掘,我改进了fitness和metrics方案(附python代码和数据)

原创文章第626篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 我们目前投入使用的因子挖掘&#xff0c;基于两个框架&#xff0c;deap和gplearn&#xff0c;deap做一点点改动&#xff0c;就可以完美应用于多标的截面因子挖掘。而gplearn如果要支…

秋叶SD整合安装包更新了!8月最新版4.9【附下载】

01 SD整合包可以扫描下方&#xff0c;免费获取 02 安装步骤 下载好后解压双击打开即可使用&#xff08;第一次安装部署时间稍长&#xff0c;等待一会即可&#xff09; 安装完进入界面后&#xff0c;点击右下角一键启动&#xff0c;稍微等待一会儿就会加载WebUI。 选择大模…

期货模拟交易系统考核选拔系统资管分仓有哪些特点?

分仓账户本身是为了风险管理和资金管理的目的而设立的&#xff0c;‌通过将资金分散到不同的账户中&#xff0c;‌可以降低整体风险&#xff0c;‌避免某个合约的亏损对整个资金造成过大的影响。‌这种分散投资的策略有助于提高交易的安全性。‌然而&#xff0c;‌分仓账户的安…

MySQL 索引合并优化实践

在生产环境的数据库中&#xff0c;经常会看到有些 SQL 的 where 条件包含&#xff1a;普通索引等值 主键范围查询 order by limit。明明走普通索引效率更高&#xff0c;但是选择走了索引合并&#xff0c;本文就对这种索引合并的情况研究一下。 作者&#xff1a;张洛丹&#x…

细数目标管理的坑:避免陷阱,实现高效执行

目标管理作为一种被广泛采用的管理方法&#xff0c;通过明确的目标设定和追踪&#xff0c;提升组织绩效和员工动力。然而&#xff0c;正如任何管理工具一样&#xff0c;目标管理也并非完美无缺&#xff0c;其在实际应用中往往伴随着一系列潜在的“坑”。 一、目标设定&#x…

如何使用DataGear零编码快速制作MQTT物联网实时数据看板

DataGear是一个开源免费的数据可视化分析平台&#xff0c;企业版在开源版基础上开发&#xff0c;新增了诸多企业级特性&#xff0c;包括&#xff1a;MySQL及更多部署数据库支持、MQTT/WebSocket/Redis/MongoDB数据集、OAuth2.0/CAS/JWT/LDAP统一登录支持、前后端敏感信息加密传…

ArcGIS 数据服务在三维 Cesium/SuperMap 项目中使用遇到的一些问题及其解决方法

ArcGIS 数据服务在三维 Cesium/SuperMap 项目中使用遇到的一些问题及其解决方法 一、三维系统支持的 ArcGIS 服务及其投影 1、动态服务 ArcGIS 动态服务的数据&#xff0c;支持任意投影在三维系统中加载。 2、切片服务 ArcGIS 切片服务仅支持 3857(web 墨卡托投影)&#x…

C++ 设计模式(1. 单例模式)

单例模式是一种创建型设计模式&#xff0c; 它的核心思想是保证一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。 特点 全局访问点的意思是&#xff0c;为了让其他类能够获取到这个唯一实例&#xff0c;该类提供了一个全局访问点&#xff08;通常是一个静态…

锐特驱动器ECR系列IO输出高电平配置

设置极性&#xff1a;常闭值0 默认输出极性常开&#xff0c;平时高组态或无电平输出&#xff0c;点通工作时输出低电平&#xff1b;常闭平时低电平&#xff0c;工作时输出高电平&#xff1b; 常开常闭概念具体可参考&#xff1a; http://t.csdnimg.cn/TIsW9 设置输出功能&…

如何用Java SpringBoot+Vue搭建校内跑腿业务系统?实战教程解析

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

​​​​​​​STM32通过SPI硬件读写W25Q64

目录 STM32通过SPI硬件读写W25Q64 1. STM32的SPI外设简介 2. STM32的SPI框图 2.1 数据寄存器和移位寄存器&#xff08;左上角部分&#xff09; 控制逻辑&#xff08;其余右下角的部分&#xff09; 3.STM32的SPI基本框图 4. STM32的SPI主模式全双工连续传输 时序图 5. S…

网安新声 | 从微软“狂躁许可”漏洞事件看安全新挑战与应对策略

网安加社区【网安新声】栏目&#xff0c;汇聚网络安全领域的权威专家与资深学者&#xff0c;紧跟当下热点安全事件、剖析前沿技术动态及政策导向&#xff0c;以专业视野和前瞻洞察&#xff0c;引领行业共同探讨并应对新挑战的策略与可行路径。 近期&#xff0c;微软披露了一个最…

AIGC企业知识库系统的全方位应用

在知识爆炸的时代&#xff0c;企业如同航行在浩瀚信息海洋中的巨轮&#xff0c;每一滴知识的浪花都可能成为推动其破浪前行的动力。而 AIGC企业知识库系统可以帮助企业精准捕捞、高效利用这些宝贵资源&#xff0c;不仅重塑了企业知识管理的版图&#xff0c;更引领了一场前所未有…

秋招力扣Hot100刷题总结——回溯

回溯问题通常应用于解决排列组合等问题&#xff0c;需要注意的是回溯函数中的参数、结束条件、遍历开始顺序等。 回溯三部曲&#xff1a; &#xff08;1&#xff09;确定递归函数的参数。 &#xff08;2&#xff09;确定递归函数的终止条件。 &#xff08;3&#xff09;确定单层…