VeeValidate——vue2.0表单验证插件
一、vee-validate入门
vee-validate 是一个轻量级的 vue表单验证插件。它有很多开箱即用的验证规则,也支持自定义验证规则。它是基于模板的,因此它与HTML5验证API类似且熟悉。可以验证HTML5输入以及自定义Vue组件。
项目地址:vee-validate
官方文档:VeeValidate
1、安装
# NPM安装
$ npm install vee-validate --save # CDN安装
<!-- jsdelivr cdn -->
<script src="https://cdn.jsdelivr.net/npm/vee-validate@latest/dist/vee-validate.js"></script> <!-- unpkg -->
<script src="https://unpkg.com/vee-validate@latest"></script>
2、引用
(1)方法一:在main.js中添加
这里使用的是ES6/ES2015语法。ES2015语法是从ES5的一次巨大飞跃,它给JavaScript增加了大量的功能特性。
import Vue from 'vue'
import axios from 'axios'
import VeeValidate, {Validator} from 'vee-validate';
import veeMessage from 'vee-validate/dist/locale/zh_CN'; // 添加表单验证
Vue.use(VeeValidate, {
classes: true,
classNames: {
valid: 'is-valid',
invalid: 'is-invalid'
}
}); // 使用中文提示
Validator.localize('zh_CN', veeMessage);
zh_CN是从 node_module/vee-validate/dist/locale目录下拷贝到项目中的中文语言包。
(2)方法二:直接包含脚本
<script src="path/to/vue.js"></script>
<script src="path/to/vee-validate.js"></script>
<script>
Vue.use(VeeValidate); // good to go.
</script>
3、基本使用
只需要将 v-validate 指令添加到要验证的输入中,并确保输入中包含生成错误消息的 name 属性。然后,向指令传递一个 rules 字符串,其中包含由管道 ‘|’ 分隔的验证规则列表。
<input v-validate="'required|email'" name="email" type="text">
在上面示例中, required 表明该字段是必须的,email 则表示该字段必须为电子邮件。因此使用结合这两个规则,声明字符串变量 required|email 给 v-validate 表达式的值。
如果要显示错误信息,只需使用 errors.first 方法获取该字段生成的第一个错误:
<span>{{ errors.first('email') }}</span>
但是需要注意:客户端验证永远不能替代服务器验证,确保在后端验证用户的任何输入。
提醒:错误信息里面的名称通常就是表单的name属性,除非是通过Vue实例传递进去的。
提醒:养成习惯,给每个field添加 name 属性,如果没有 name 属性又没有对值进行绑定的话,validator 可能不会对其进行正确校验。
二、显示错误
errors是组件内置的一个数据模型,用来存储和处理错误信息。默认情况下,错误包实例将注入组件 errors 名称下的计算属性中,可以对其进行自定义以避免与其他 库/组件 发送冲突。
1、显示单个错误消息
希望一次为字段显示一个错误,使用 errors.first('fieldName') 方法执行此操作。
<input type="text" name="fieldName" v-validate="'required'">
<span>{{ errors.first('fieldName') }}</span>
VeeValidate 默认每个字段仅生成一条消息,因为它在运行验证管道时使用快速退出策略。当检测到第一个失败规则时,它将生成消息并将其存储在错误包实例中,然后忽略其他规则结果。
要禁用此行为,需要 fastExit 在 VeeValidate的配置中 配置选项或使用 continues 修饰符。
2、显示多条错误消息
通常应用场景是允许用户一次修复多个输入错误。errors.collect('fieldName') 方法可以将特定字段的所有错误消息收集到数组中。
<input type="text" name="fieldName" v-validate.continues="'required|alpha|min:5'">
<ul>
<li v-for="error in errors.collect('fieldName')">{{ error }}</li>
</ul>
3、显示所有错误
如果需要在表单上显示所有字段错误,尤其是非常大的表单。
(1)错误列表
可以使用 errors.all() 将所有字段错误收集到单个平面数组中。
<input type="text" name="first" v-validate.continues="'required|alpha|min:5'">
<input type="text" name="second" v-validate.continues="'required|alpha|min:5'">
<ul>
<li v-for="error in errors.all()">{{ error }}</li>
</ul>
(2)按字段名称分组
使用 erros.collect() 按字段名称对错误消息进行分组,其中键是字段名称,值是每个字段的错误消息数组:
<input type="text" name="first" v-validate.continues="'required|alpha|min:5'">
<input type="text" name="second" v-validate.continues="'required|alpha|min:5'">
<ul>
<li v-for="group in errors.collect()">
<ul>
<li v-for="error in group">{{ error }}</li>
</ul>
</li>
</ul>
三、内置的验证规则
1、内置验证规则汇总
after{target} - 比target要大的一个合法日期,格式(DD/MM/YYYY)
alpha - 只包含英文字符
alpha_dash - 可以包含英文、数字、下划线、破折号
alpha_num - 可以包含英文和数字
before:{target} - 和after相反
between:{min},{max} - 在min和max之间的数字
confirmed:{target} - 必须和target一样
date_between:{min,max} - 日期在min和max之间
date_format:{format} - 合法的format格式化日期
decimal:{decimals?} - 数字,而且是decimals进制
digits:{length} - 长度为length的数字
dimensions:{width},{height} - 符合宽高规定的图片
email - 不解释
ext:[extensions] - 后缀名
image - 图片
in:[list] - 包含在数组list内的值
ip - ipv4地址
max:{length} - 最大长度为length的字符
mimes:[list] - 文件类型
min - max相反
mot_in - in相反
numeric - 只允许数字
regex:{pattern} - 值必须符合正则pattern
required - 不解释
size:{kb} - 文件大小不超过
url:{domain?} - (指定域名的)url
2、内置规则使用示例
<input type="text" class="form-control" id="tel" v-model="queryInfo.tel" placeholder="手机号码"
v-validate="'min:11|max:11|numeric'" name="tel" data-vv-as="手机号码"> <input type="text" class="form-control" id="idNum" v-model="queryInfo.idNumCipher" placeholder="身份证号"
v-validate="'required|max:18|min:18|alpha_num'" name="idNum" data-vv-as="身份证号"> <input type="text" class="form-control" id="emailnum" v-model="queryInfo.email" placeholder="电子邮箱"
v-validate="'email'" name="emailnum" data-vv-as="电子邮箱">
如果使用了 data-vv-as 属性,在输入生成任何错误消息时,它将使用 data-vv-as 值而不是实际的字段名称。
这样对于简单设置和显示本地化名称非常有用,但仅适用于单一语言环境页面。
四、自定义验证规则
1、直接定义
const validator = (value, args) => {
    // Return a Boolean or a Promise.
}
//最基本的形式,只返回布尔值或者Promise,带默认的错误提示
2、对象形式
const validator = {
    getMessage(field, args) { // 添加到默认的英文错误消息里面
        // Returns a message.
    },
    validate(value, args) {
        // Returns a Boolean or a Promise.
    }
};
3、添加到指定语言的错误消息
const validator = {
    messages: {
        en: (field, args) => {
            // 英文错误提示
        },
        cn: (field, args) => {
            // 中文错误提示
        }
    },
    validate(value, args) {
        // Returns a Boolean or a Promise.
    }
};
创建了规则之后,用extend方法添加到Validator里:
import { Validator } from 'vee-validate';
const isMobile = {
    messages: {
        en:(field, args) => field + '必须是11位手机号码',
    },
    validate: (value, args) => {
       return value.length == 11 && /^((13|14|15|17|18)[0-9]{1}\d{8})$/.test(value)
    }
}
Validator.extend('mobile', isMobile);
//或者直接
Validator.extend('mobile', {
    messages: {
      en:field => field + '必须是11位手机号码',
    },
    validate: value => {
      return value.length == 11 && /^((13|14|15|17|18)[0-9]{1}\d{8})$/.test(value)
    }
}); 
然后可以直接把mobile当成内置规则使用:
<input v-validate data-rules="required|mobile" :class="{'input': true, 'is-danger': errors.has('mobile') }" name="mobile" type="text" placeholder="Mobile">
<span v-show="errors.has('mobile')" class="help is-danger">{{ errors.first('mobile') }}</span>
4、自定义内置规则的错误信息
import { Validator } from 'vee-validate';
const dictionary = {
    en: {
        messages: {
            alpha: () => 'Some English Message'
        }
    },
    cn: {
        messages: {
            alpha: () => '对alpha规则的错误定义中文描述'
        }
    }
};
Validator.updateDictionary(dictionary);
5、常用自定义规则
Validator.localize('zh_CN', veeMessage);
// 自定义身份证号码验证
Validator.extend('idCardNum', {
  getMessage: field => '请输入正确的身份证号码',
  // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
  validate: value => /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)
});
// 自定义手机号码验证
Validator.extend('mobile', {       // extend的第一个参数就是自定义的规则的名字
  getMessage: field => '请输入正确的手机号码',       // getMessage中是错误提示信息
  validate: value => value.length === 11 && /^((13|14|15|17|18)[0-9]{1}\d{8})$/.test(value)    // validate是验证规则,返回一个布尔值或promise
});
// 自定义敏感词过滤
const sensitiveWordRule = {
  getMessage: (field, args) => field + '敏感字段',
  validate: (value, args) => {
    let sensitiveMap = makeSensitiveMap(sensitiveWordList);
    console.log('sensitivemap', sensitiveMap);
    if (checkSensitiveWord(sensitiveMap, value).length > 0) {
      console.log(checkSensitiveWord(sensitiveMap, value))
      return false;
    } else {
      console.log(checkSensitiveWord(sensitiveMap, value))
      return true;
    }
  }
};
Validator.extend('sensitiveWordFilter', sensitiveWordRule);
6、与相关组件配合验证
针对Enums和Select(src/components/chart/Select2.vue)验证:
// 自定义 Enmus 验证
Validator.extend('enums', { // extend的第一个参数就是自定义的规则的名字
validate: value => value > 0 && value != null && value != undefined // validate是验证规则,返回一个布尔值或promise
}); // 自定义 Select2 验证
Validator.extend('select2', { // extend的第一个参数就是自定义的规则的名字
getMessage: field => field + '不能为空',
validate: value => value > 0 && value != null && value != undefined // validate是验证规则,返回一个布尔值或promise
});
针对 Datepicker 验证:
// 自定义时间区间选择组件 Datepicker 验证 -- 起止时间验证
Validator.extend('datepickerwrongrange', {
getMessage: field => '起止时间不能相等',
validate: function (value) {
var d = value.split('-');
var beginTime = parseInt(d[0]);
var endTime = parseInt(d[1]);
if(beginTime == endTime) {
return false;
}
else {
return true;
}
}
}); // 自定义时间区间选择组件 Datepicker 验证 -- 开始时间验证
Validator.extend('datepickerwrongbegin', {
getMessage: field => '开始时间不能小于当前时间后的一小时',
validate: function (value) {
var d = value.split('-');
var beginTime = parseInt(d[0]);
var endTime = parseInt(d[1]);
if(beginTime <= (Date.parse(new Date()) + 3600*1000)) {
return false;
}
else {
return true;
}
}
});
VeeValidate——vue2.0表单验证插件的更多相关文章
- jquery validate表单验证插件-推荐
		
1 表单验证的准备工作 在开启长篇大论之前,首先将表单验证的效果展示给大家. 1.点击表单项,显示帮助提示 2.鼠标离开表单项时,开始校验元素 3.鼠标离开后的正确.错误提示及鼠标移入时的帮 ...
 - 表单验证插件之jquery.validate.js
		
提到表单验证的插件,第一个想到的就是jquery.validate.js,所以小生想在这里稍微详细地说一下这款插件的具体使用方法,便于理解,我直接附上整段demo的代码(没怎么调样式,主要是看js): ...
 - jQuery学习之:Validation表单验证插件
		
http://polaris.blog.51cto.com/1146394/258781/ 最近由于公司决定使用AJAX + Struts2来重构项目,让我仔细研究一下这两个,然后集中给同事讲讲,让每 ...
 - jquery validate表单验证插件
		
1 表单验证的准备工作 在开启长篇大论之前,首先将表单验证的效果展示给大家. 1.点击表单项,显示帮助提示 2.鼠标离开表单项时,开始校验元素 3.鼠标离开后的正确.错误提示及鼠标移入时的帮 ...
 - JS表单验证插件(支持Ajax验证)
		
自己编写了一个表单验证插件,支持ajax验证,使用起来很简单. 每个需要验证的表单元素下面有一个span标签,这个标签的class有一个valid表示需要验证,如果有nullable则表示可为空:ru ...
 - 【jQuery基础学习】06 jQuery表单验证插件-Validation
		
jQuery的基础部分前面都讲完了,那么就看插件了. 关于jQuery表单验证插件-Validation validation特点: 内置验证规则:拥有必填.数字.E-Mail.URL和信用卡号码等1 ...
 - jQuery Validate 表单验证插件----自定义一个验证方法
		
一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW 访问密码 f224 二.引入依赖包 <script src="../../scripts/j ...
 - jQuery Validate 表单验证插件----自定义校验结果样式
		
一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW 访问密码 f224 二.引入依赖包 <script src="../../scripts/j ...
 - jQuery Validate 表单验证插件----通过name属性来关联字段来验证,改变默认的提示信息,将校验规则写到 js 代码中
		
一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW 访问密码 f224 二. 添加一个另外一个插件jquery.validate.messages_cn.js. ...
 
随机推荐
- Python连载18-closure闭包解释及其注意点
			
一.闭包 1.定义:当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回的函数之中,这种结果,叫做闭包. 2.例子:连载17中 ...
 - java基础之----java常见异常及代码示例
			
概述 java中有两种错误类型,一个是Exception,一个是Error,都在java.lang包下,一般来说程序中的try...catch捕获的是Exception类型的异常,而Error类型的错 ...
 - CSS3 滤镜Filter亮度动画
			
CSS3 滤镜Filter亮度动画 -webkit-filter:brightness 值越高 亮度越亮<pre><!DOCTYPE html><html lang=&q ...
 - Django学习笔记(14)——AJAX与Form组件知识补充(局部钩子和全局钩子详解)
			
我在之前做了一个关于AJAX和form组件的笔记,可以参考:Django学习笔记(8)——前后台数据交互实战(AJAX):Django学习笔记(6)——Form表单 我觉得自己在写Django笔记(8 ...
 - JSTL+EL表达式+JSP自定义框架案例
			
不会框架不要紧,我带你自定义框架 前言:这标题说的有点大了,当一回标题党,之前在学JSP的时候提到了JSTL和EL表达式,由于一直钟情于Servlet,迟迟没有更新别的,这回算是跳出来了.这回放个大招 ...
 - 2019-11-29-WPF-元素裁剪-Clip-属性
			
原文:2019-11-29-WPF-元素裁剪-Clip-属性 title author date CreateTime categories WPF 元素裁剪 Clip 属性 lindexi 2019 ...
 - SqlServer 开篇简介
			
实例:我们的电脑中可以安装一个或多个SqlServer实例,每一个SqlServer实例可以包含一个或者多个数据库. 架构:数据库中,又有一个或者多个架构.架构里面包含:表,视图,存储过程. 文件与文 ...
 - vs 本地调试(IIS)
			
参考地址:https://blog.csdn.net/qq_18979049/article/details/78613878 一.情景描述 1.有的项目需要部署才能进行真实情况模拟(例如微信公众号) ...
 - Lambda(一)lambda表达式初体验
			
Lambda(一)lambda表达式初体验 Lambda引入 : 随着需求的不断改变,代码也需要随之变化 需求一:有一个农场主要从一堆苹果中挑选出绿色的苹果 解决方案:常规做法,source code ...
 - Python项目中使用配置文件
			
一些讨论 Python中使用配置文件的最佳实践 Python中使用配置文件的最好方法 Python符号常量 多种配置文件方案对比 我的建议 1. 排除yaml yaml 不是一个好主意, 因为需要给项 ...