详解vuelidate 对于vueJs2.0的验证解决方案


Posted in Javascript onMarch 09, 2017

介绍

在后端项目里 比如我们的Laravel框架 对于表单验证有自己的一套validation机制 他将验证集成在FormRequest

我们只需要在我们的方法中依赖注入我们自己实例化后的验证类 当然也可以直接去在方法里去验证表单数据

而在我们的前端的项目里 也就是在我们的vue项目里 也有比较好的验证解决方案 也就是这的vuelidate

1.安装

和我们安装前端包一样 在项目终端执行:

$ npm install vuelidate --save

安装完成后和我们去使用vuex一样 在main.js去引入声明这个package:

import Vue from 'vue'
import Vuelidate from 'vuelidate'
Vue.use(Vuelidate)

当然你也可以在需要用到验证的组件里去引用一个相对小的版本:

import { validationMixin } from 'vuelidate'

var Component = Vue.extend({
 mixins: [validationMixin],
 validation: { ... }
})

如果你偏好通过require这样的形式 你也可以这样引入:

const { validationMixin, default: Vuelidate } = require('vuelidate')
const { required, minLength } = require('vuelidate/lib/validators')

2.使用

其实使用起来真的很方便 下面举例来说就是在我的项目里的使用

1.注册验证

在用户注册时 我们通常的需要处理的表单字段就是name,email,password,confirm_pwd

首先我在Register.vue这个组件文件中把基本的样式结构写好 这取决于每个人

接着是我们对表单数据的验证:

这里是对用户名和邮箱的验证 就像之前提到的 我们先引入我们的验证规则:

import { required,minLength,between,email } from 'vuelidate/lib/validators'

因为我是对一个新用户的注册 所以我定义一个data

data(){
  return{
    newUser: {
      name:'',
      email:'',
      password:'',
      confirm_pwd:''
    },
  }
},

接着去定义我们的验证字段的规则:

validations: {
  newUser:{
    name: {
      required,
      minLength: minLength(2)
    },
    email: {
      required,email
    }
  }
},

定义这些验证规则之后 下面是我的html部分内容

<div class="control-group" v-bind:class="{ 'form-group--error': $v.newUser.name.$error }">
<label class="control-label">用户名</label>
<el-input
    placeholder="请输入你的用户名"
    v-model.trim="newUser.name"
    @input="$v.newUser.name.$touch()"
>
</el-input>
</div>
<span class="form-group__message" v-if="!$v.newUser.name.required">用户名不能为空</span>
<span class="form-group__message" v-if="!$v.newUser.name.minLength">用户名不能太短</span>

<div class="control-group" v-bind:class="{ 'form-group--error': $v.newUser.email.$error }">
<label class="control-label">邮箱</label>
<el-input
    placeholder="请输入你的邮箱"
    v-model.trim="newUser.email"
    @input="$v.newUser.email.$touch()"
>
</el-input>
</div>
<span class="form-group__message" v-if="!$v.newUser.email.required">邮箱不能为空</span>
<span class="form-group__message" v-if="!$v.newUser.email.email">请填写正确的邮箱格式</span>

每个人可以都不一样 官方文档上也给出了demo:

<div>
 <div class="form-group" v-bind:class="{ 'form-group--error': $v.flatA.$error }">
  <label class="form__label">Flat A</label>
  <input class="form__input" v-model.trim="flatA" @input="$v.flatA.$touch()">
 </div><span class="form-group__message" v-if="!$v.flatA.required">Field is required.</span>
 <div class="form-group" v-bind:class="{ 'form-group--error': $v.flatB.$error }">
  <label class="form__label">Flat B</label>
  <input class="form__input" v-model.trim="flatB" @input="$v.flatB.$touch()">
 </div><span class="form-group__message" v-if="!$v.flatB.required">Field is required.</span>
 <div class="form-group" v-bind:class="{ 'form-group--error': $v.forGroup.nested.$error }">
  <label class="form__label">Nested field</label>
  <input class="form__input" v-model.trim="forGroup.nested" @input="$v.forGroup.nested.$touch()">
 </div><span class="form-group__message" v-if="!$v.forGroup.nested.required">Field is required.</span>
 <div class="form-group" v-bind:class="{ 'form-group--error': $v.validationGroup.$error }"></div><span class="form-group__message" v-if="$v.validationGroup.$error">Group is invalid.</span>
 <pre>validationGroup: {{ $v.validationGroup }}</pre>
</div>

我们先这样举例 值得注意的是我们需要去知道他的$v.name里面的内容

也就是 $invalid $dirty $error $pending $each 这个value

特别的注意 $error里的解释:It is a shorthand to $invalid && $dirty

也就是一个与的组合 你可以去试着改变这两者的值 再去看$error的值

当然还有两个重要的方法: $touch $reset 上面也有实例 说简单点就是设置这个以及子节点的$dirty 为true或者false

而设置这个$dirty 再结合 $invalid就可以判断验证成功与否

$error 是由$dirty和$invalid共同决定的

在这里的验证规则流程是这样的 如果$error为true那么form-group会添加一个form-group--error这个class

只有在$error为true时 如果你不符合任意一个验证规则 例如不符合required 那么就会提示验证失败

如果验证错误就给出错误提示 这是我的错误样式:

.form-group__message{
  display: none;
  font-size: .95rem;
  color: #CC3333;
  margin-left: 10em;
  margin-bottom: 12px;
}
.form-group--error+.form-group__message {
  display: block;
  color: #CC3333;
}

.form-group--error input, .form-group--error input:focus, .form-group--error input:hover, .form-group--error textarea {
  border-color: #CC3333;
}

2.密码验证

密码验证其实和上面的差不多 只不过他的验证规则时通过 sameAs 来进行验证的

3.组合验证

除了上面这些还有一个组合验证 也就是如果任意一个不符合验证规则就不通过 这个还是挺常用的

我们可以在验证字段这样去组合:

validations: {
  flatA: { required },
  flatB: { required },
  forGroup: {
   nested: { required }
  },
  validationGroup: ['flatA', 'flatB', 'forGroup.nested']
}

如果任意一个就是FlatA flatB forGroup其中一个不符合验证规则 那么$v.validationGroup.$error就是false

4.异步验证

特别是在验证唯一性的时候 我们肯定会遇到这样的一个场景:

就比如我们的邮箱 如果已经注册过这个邮箱了 那么再用这个邮箱去注册显然不是我们想要的

还有就是我们登录时我们需要去核对我们的用户的密码

这边我给出的实例就是对于用户名的注册 如果已经注册了就会提示已经注册过

完全支持async/await语法。它与Fetch API结合使用也很出色 那么我们可以通过后端API提供的结果可以进行判断
我们可以去增加我们唯一性的验证:

name: {
  required,
  minLength: minLength(4),
  async isUnique (value) {
    if (value === '') return true
    const response = await fetch(`http://localhost:8000/api/unique/name/${value}`)
    return Boolean(await response.json())
  }
},

这里我现在本地测试 通过Laravel作为后端来提供的数据校验 实际项目中的话可以再结合数据库

//用户验证路由
Route::group(['prefix'=>'unique','middleware'=>['api','cors']], function () {
  Route::get('/name/{value}',function(Request $request,$value){
    if($value==="gavin"){
      return response()->json(false);
    }
    return response()->json(true);
  });
});

如果我们去注册 gavin这个用户就会提示该昵称已经被注册 因为在用户名我增加了isUnique验证

<span class="form-group__message" v-if="!$v.newUser.name.isUnique">用户名已经被注册</span>

显示结果应该是这样的:

详解vuelidate 对于vueJs2.0的验证解决方案

5.自定义验证

同样的我们不仅可以使用它提供给我们的验证规则 我们也可以自定义验证规则并与之前的进行组合

官方给出了一个简单实例:

export default value => {
 if (Array.isArray(value)) return !!value.length

 return value === undefined || value === null
  ? false
  : !!String(value).length
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js判读浏览器是否支持html5的canvas的代码
Nov 18 Javascript
js中同步与异步处理的方法和区别总结
Dec 25 Javascript
Google Maps API地图应用示例分享
Oct 23 Javascript
设置jQueryUI DatePicker默认语言为中文
Jun 04 Javascript
ionic组件ion-tabs选项卡切换效果实例
Aug 27 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
Nov 01 Javascript
移动端web滚动分页的实现方法
May 05 Javascript
JS实现小球的弹性碰撞效果
Nov 11 Javascript
JS和JQuery实现雪花飘落效果
Nov 30 jQuery
node中modules.exports与exports导出的区别
Jun 08 Javascript
layui从数据库中获取复选框的值并默认选中方法
Aug 15 Javascript
vue修饰符.capture和.self的区别
Apr 22 Vue.js
Bootstrap禁用响应式布局的实现方法
Mar 09 #Javascript
微信小程序 template模板详解及实例代码
Mar 09 #Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
Mar 09 #Javascript
canvas实现爱心和彩虹雨效果
Mar 09 #Javascript
vue如何实现observer和watcher源码解析
Mar 09 #Javascript
详解VueJs异步动态加载块
Mar 09 #Javascript
微信小程序 设置启动页面的两种方法
Mar 09 #Javascript
You might like
服务器端解压缩zip的脚本
2006/12/22 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
PHP精确计算功能示例
2016/11/29 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
JavaScript将字符串转换为整数的方法
2015/04/14 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
2016/10/26 Javascript
vue登录路由验证的实现
2017/12/13 Javascript
详解NodeJs开发微信公众号
2018/05/25 NodeJs
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
JS实现简单随机3D骰子
2019/10/24 Javascript
基于JavaScript实现猜数字游戏代码实例
2020/07/30 Javascript
python用于url解码和中文解析的小脚本(python url decoder)
2013/08/11 Python
讲解python参数和作用域的使用
2013/11/01 Python
python实现apahce网站日志分析示例
2014/04/02 Python
使用python爬取B站千万级数据
2018/06/08 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
使用Python如何测试InnoDB与MyISAM的读写性能
2018/09/18 Python
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
python实现字符串加密成纯数字
2019/03/19 Python
如何使用Python标准库进行性能测试
2019/06/25 Python
Python 求数组局部最大值的实例
2019/11/26 Python
在Python中使用MongoEngine操作数据库教程实例
2019/12/03 Python
如何通过Django使用本地css/js文件
2020/01/20 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
2021/01/11 Python
python上下文管理的使用场景实例讲解
2021/03/03 Python
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
药剂专业学生求职信范文
2013/12/28 职场文书
咖啡厅商业计划书
2014/09/15 职场文书
租车协议书
2015/01/27 职场文书
中学教师师德师风承诺书
2015/04/28 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers