余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

使用HTML和Vuejs进行表单验证(html和vuejs表单验证)

xiyangw 2022-11-25 12:21 66 浏览 0 评论

他们说大多数网络应用只是HTML表单。好吧,表单需要验证,谢天谢地,HTML5带有许多优秀的内置表单验证功能,可用于电子邮件,数字,最大值,分钟等。您甚至可以使用模式编写自己的验证规则。在本文中,我将讨论如何在覆盖无聊的默认值时利用HTML5验证,以便您可以根据需要显示验证错误。我将与Vuejs合作,但即使你不使用Vue,你也可以随时跟进。

让我们从Bootstrap示例的Checkout表单的开始,这样我们就不必过于担心样式了。您可以在此处克隆器。设置应如下所示:



使用Vuejs Starter进行HTML验证

默认的HTML5验证不会立即显示所有表单错误。具有讽刺意味的是,一旦用户提交,浏览器实际上就知道所有无效字段,所以现在我们所要做的就是检查它们然后显示我们喜欢的内容。

现在让我们为表单和一个使用Vuejs捕获提交事件的监听器添加一个id。

<form class="needs-validation" id="validated-form">
 <div class="row">
 <div class="col-md-6 mb-3">
 <label for="firstName">First name</label>
 <input type="text" class="form-control" id="firstName" placeholder="" value="" required>
 <div class="invalid-feedback">
 Valid first name is required.
 </div>
 </div>
 <div class="col-md-6 mb-3">
 <label for="lastName">Last name</label>
 <input type="text" class="form-control" id="lastName" placeholder="" value="" required>
 <div class="invalid-feedback">
 Valid last name is required.
 </div>
 </div>
 </div>
 <!-- Rest of the form removed to save space -->
 <button class="btn btn-primary btn-lg btn-block" type="submit" @click.prevent="submitForm()">SUBMIT</button>
</form>

添加事件监听器以提交表单

然后在我们的form-validation.js文件中,我们将初始化Vuejs并创建处理表单提交和验证的方法。

const vueApp = new Vue({
 el: '#validated-form',
 methods: {
 submitForm () {
 if (this.validateForm()) {
 console.log('formValidated');
 //submit form to backend
 }
 },
 validateForm () {
 var formId = 'validated-form';
 var nodes = document.querySelectorAll(`#${formId} :invalid`);
 console.log(nodes);
 return true;
 }
 }
});

这里我们创建了两个方法submitFormvalidateForm。submitForm调用validateForm,如果满足所有验证规则,则返回true。现在,我们从控制日志记录中查看所有无效的表单输入,我们可以找到许多有趣的属性,包括我们可以向用户显示的validationMessage



输入属性无效

接下来,让我们创建将保存每个无效输入的validationErrors的数据属性。然后我们将循环遍历无效输入数组以设置每个输入。

const vueApp = new Vue({
 el: '#validated-form',
 data: function () {
 return {
 validationErrors: {
 firstName: null,
 lastName: null,
 username: null,
 email: null,
 address: null,
 country: null,
 state: null,
 zip: null,
 }
 }
 },
 methods: {
 submitForm () {
 if (this.validateForm()) {
 alert('Form Submitted')
 //submit form to backend
 }
 },
 validateForm () {
 var formId = 'validated-form';
 var nodes = document.querySelectorAll(`#${formId} :invalid`);
 var errorObjectName = 'validationErrors';
 var vm = this; //current vue instance;
 Object.keys(this[errorObjectName]).forEach(key => {
 this[errorObjectName][key] = null
 });
 if (nodes.length > 0) {
 nodes.forEach(node => {
 this[errorObjectName][node.name] = node.validationMessage;
 node.addEventListener('change', function (e) {
 vm.validateForm();
 });
 });
 return false;
 }
 else {
 return true;
 }
 }
 }
});

在这里,我们做了很多事情。我们创建了validationErrors数据属性来保存每个字段的错误消息。validationErrors对象的每个属性对应于要验证的每个表单元素的name属性。因此在validateForm方法中,我们清除任何先前的错误消息,然后遍历无效字段以设置其相应的validationErrors。我们还添加了一个事件侦听器,一旦无效字段发生更改,就会重新验证。

现在我们需要为要验证的每个字段添加名称属性,这在制作表单时非常正常。然后,我们还应该添加将向用户显示错误消息的span元素。

<form class="needs-validation" id="validated-form">
 <div class="row">
 <div class="col-md-6 mb-3">
 <label for="firstName">First name</label>
 <input type="text" class="form-control" name="firstName" placeholder="" value="" required>
 <span class="text-danger" v-if="validationErrors.firstName" v-text="validationErrors.firstName"></span>
 </div>
 <div class="col-md-6 mb-3">
 <label for="lastName">Last name</label>
 <input type="text" class="form-control" name="lastName" placeholder="" value="" required>
 <span class="text-danger" v-if="validationErrors.lastName" v-text="validationErrors.lastName"></span>
 </div>
 </div>
 <div class="mb-3">
 <label for="username">Username</label>
 <div class="input-group">
 <div class="input-group-prepend">
 <span class="input-group-text">@</span>
 </div>
 <input type="text" class="form-control" name="username" placeholder="Username" required>
 <span class="text-danger" v-if="validationErrors.username" style="width: 100%;" v-text="validationErrors.username"></span>
 </div>
 </div>
 <div class="mb-3">
 <label for="email">Email <span class="text-muted">(Optional)</span></label>
 <input type="email" class="form-control" name="email" placeholder="you@example.com">
 <div class="text-danger" v-if="validationErrors.email" style="width: 100%;">
 <span v-text="validationErrors.email"></span>
 </div>
 </div>
 
 <!-- Rest of form hidden for space -->
 <button class="btn btn-primary btn-lg btn-block" type="submit"
 @click.prevent="submitForm()">SUBMIT</button>
</form>

现在,一旦我们提交表单,我们的用户就可以看到他们需要修复的所有验证错误。很酷的是我们已经完成了它而无需引入额外的库来进行验证。现在,因为我们正在利用Vue的数据绑定能力,我们可以从这里获得有关我们希望如何显示错误的创意。


使用HTML5模式

如果我们需要超出可用的验证规则,该怎么办?例如,检查邮政编码是否有效。这就是HTML5模式非常有用的地方,因为我们可以在HTML中编写正则表达式来执行我们需要的任何类型的检查。我觉得有人正在宣誓正常表达,但幸运的是你可以在html5pattern.com找到一大堆有用的正则表达式。

好吧,找到一个正则表达式比我想象的要困难一些。事实证明,他们大多是7位数字。所以[0-9] {13,16}应该可以正常工作。现在我们遇到了一个新问题。关于HTML5模式的错误消息不是很有用,所以我们需要指定自己的。我们需要一种方法来告诉validateForm函数显示什么消息。

<form class="needs-validation" id="validated-form">
 <div class="row">
 <!-- Rest of form hidden for space -->
 
 <div class="col-md-3 mb-3">
 <label for="zip">Zip</label>
 <input type="text" class="form-control" name="zip" placeholder="" pattern="[0-9]{7}" title="Invalid Zip Code" required>
 <span class="text-danger" v-if="validationErrors.zip" style="width: 100%;" v-text="validationErrors.zip"></span>
 </div>
 </div>
 <button class="btn btn-primary btn-lg btn-block" type="submit"
 @click.prevent="submitForm()">SUBMIT</button>
</form>

添加标题和模式属性

然后我们可以在validateForm方法中检查title属性:

validateForm (formId = 'validated-form', errorObjectName = 'validationErrors') {
 var nodes = document.querySelectorAll(`#${formId} :invalid`);
 var vm = this; //current vue instance;
 Object.keys(this[errorObjectName]).forEach(key => {
 this[errorObjectName][key] = null
 });
 if (nodes.length > 0) {
 nodes.forEach(node => {
 if (node.title) {
 this[errorObjectName][node.name] = node.title;
 }
 else {
 this[errorObjectName][node.name] = node.validationMessage;
 }
 node.addEventListener('change', function (e) {
 vm.validateForm(formId, errorObjectName);
 });
 });
 return false;
 }
 else {
 return true;
 }
}

这里我们添加了一个if-else块来检查title属性,如果找不到则只显示默认错误消息。此外,formIderrorObjectName变量现在被传递到validateForm函数,这允许我们在同一个网页上验证我们选择的方式和方式。


我们已经能够为表单验证创建一个简单的约定配置方法。一旦我们在validationErrors对象中指定了表单字段的名称属性,我们的cool validateForm函数就会利用内置的HTML5功能来完成剩下的工作,我们需要做的就是按照我们想要的方式显示错误。一如既往,我希望这有助于某人。

如果您正在使用Vue,则可以使用此代码段快速启动验证,并且它也不应该很难应用于其他前端框架。您还可以 此repo演示网站上找到本文的工作代码。

干杯!

转:https://itnext.io/form-validation-with-html-vuejs-54ec18e473aa

相关推荐

数控系统常见术语详解,机加工人士必备资料
数控系统常见术语详解,机加工人士必备资料

增量编码器(Incrementpulsecoder)回转式位置测量元件,装于电动机轴或滚珠丝杠上,回转时发出等间隔脉冲表示位移量。由于没有记忆元件,故不能准...

2023-09-24 17:42 xiyangw

功、功率、扭矩的关系

功=功率×时间work=power×timeW=P×T功=力×距离work=force×lengthW=F×LP×T=F×LP=F×L/T=F×V(velocity)具体到电机输出轴上,圆...

Wi-Fi协议(802.11 )常见专业术语汇总
Wi-Fi协议(802.11 )常见专业术语汇总

Wi-Fi协议(802.11)常见专业术语汇总AP(Accesspoint的简称,即访问点,接入点):是一个无线网络中的特殊节点,通过这个节点,无线网络中的...

2023-09-24 17:41 xiyangw

不需要策略模式也能避免满屏if/else
不需要策略模式也能避免满屏if/else

满屏if/elsejava复制代码publicstaticvoidmain(String[]args){inta=1;if...

2023-09-24 17:41 xiyangw

喜极而泣,我终于干掉了该死的 if-else
喜极而泣,我终于干掉了该死的 if-else

推荐阅读:面试淘宝被Tomcat面到“自闭”,学习这份文档之后“吊打”面试官刷完spring+redis+负载均衡+netty+kafka面试题,再去面试BAT...

2023-09-24 17:40 xiyangw

Python中使用三元运算符简化if-else语句
Python中使用三元运算符简化if-else语句

Python是一种极简主义的编程语言,相比其他编程语言,在多个地方简化了代码的写法,可以让我们用更少的时间更简洁地完成工作。以赋值运算符为例:a=a+b简化...

2023-09-24 17:40 xiyangw

雅思课堂 | 雅思口语写作句型第二讲
雅思课堂 | 雅思口语写作句型第二讲

纯干货,无废话用最少的时间学最制胜的内容!泡图书馆泡不过学霸?碎片时间也能弯道超车!向着雅思8分行动起来吧!雅思口语写作句型1.Ipreferseeing...

2023-09-24 17:39 xiyangw

设计模式(三)——简单的状态模式代替if-else
设计模式(三)——简单的状态模式代替if-else

博主将会针对Java面试题写一组文章,包括J2ee,SQL,主流Web框架,中间件等面试过程中面试官经常问的问题,欢迎大家关注。一起学习,一起成长。前言大多数开...

2023-09-24 17:38 xiyangw

如何优化代码中大量的if/else,switch/case?

前言随着项目的迭代,代码中存在的分支判断可能会越来越多,当里面涉及到的逻辑比较复杂或者分支数量实在是多的难以维护的时候,我们就要考虑下,有办法能让这些代码变得更优雅吗?正文使用枚举这里我们简单的定义一...

优秀程序员早就学会用“状态模式”代替if-else了
优秀程序员早就学会用“状态模式”代替if-else了

2020年已经进入倒计时了,大家立好的flag完成了吗?2020实“鼠”不易,希望2021可以“牛”转乾坤。简介状态模式是行为型设计模式的一种。其设计理念是当对...

2023-09-24 17:37 xiyangw

用Select Case语句对执行多条件进行控制
用Select Case语句对执行多条件进行控制

今日的内容是"VBA之EXCEL应用"的第六章"条件判断语句(If...Then...Else)在VBA中的利用"。这讲是第三节...

2023-09-24 17:37 xiyangw

c#入门教程(四)条件判断if else

条件判断,是编程里常用的判断语句,比如某个代码如果满足条件就执行a代码块否则就执行b代码块。案例1:inti=2*5;if(a>0){执行a代码块}elseif(a<0){执行b代码块...

每日学编程之JAVA(十一)—条件语句(if……else)

一个if语句包含一个布尔表达式和一条或多条语句。如果布尔表达式的值为true,则执行if语句中的代码块,否则执行if语句块后面的代码。if语句后面可以跟else语句,当if语句...

不需要策略模式也能避免满屏if/else

除了使用策略模式以外,还可以使用其他设计模式来避免满屏if/else的问题。以下是一些可能的解决方案:工厂模式:将if/else语句移到工厂类中,由工厂类负责创建对象。这样可以将if/else语句从客...

围绕ifelse与业务逻辑的那些梗
围绕ifelse与业务逻辑的那些梗

ifelse很重要,几乎是程序员编程核心,业务逻辑与规则也通过ifelse体现出来,语句简单但是背后文章很大,先看几则幽默图:1.也许默认使用returnf...

2023-09-24 17:36 xiyangw

取消回复欢迎 发表评论: