在Vant的基础上实现添加表单验证框架的方法示例


Posted in Javascript onDecember 05, 2018

Vant 一套基于Vue的移动端UI框架,有赞出品。

因为UI设计的够漂亮,源码结构也比较清晰,插件定位也比较明确,重要是实战过程中的使用体验不错。在最近的项目当中就使用 Vant 作为移动端的基础UI框架,但在实践过程中发现该框架和其他框架有不一样的地方。例如它不内置表单验证,接下来,我把自己实现验证框架的思路分享出来。

分析需求

我们找的插件主要能解决以下问题

  • 支持中文
  • 适应UI框架
  • 分组验证
  • 动态验证(数据动态,规则动态)

去网络上搜索了一些框架,推荐两款(在官方也有推https://cn.vuejs.org/v2/cookbook/form-validation.html )

  • vuelidate
  • vee-validate

我的项目里使用的是 vee-validate

解决问题

安装及支持中文

npm install vee-validate --save
import VeeValidate, { Validator } from 'vee-validate'
import zh_CN from 'vee-validate/dist/locale/zh_CN';

Validator.localize('zh_CN', zh_CN)
Vue.use(VeeValidate)

中文问题可以解决,但是遇到个很恶心的问题,这样的错误提示会变成 title不能为空 这样的提示,实际展示效果是不好的。
所以这个需要重构下,自己来实现错误提示的内容

const formatFileSize = function (size) {
 let units = ['Byte', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
 let threshold = 1024;
 size = Number(size) * threshold;
 let i = size === 0 ? 0 : Math.floor(Math.log(size) / Math.log(threshold));
 return (((size / Math.pow(threshold, i)).toFixed(2) * 1) + " " + (units[i]));
}
Validator.localize('zh_CN', {
 name: 'zh_CN',
 attributes: {}
 messages: {
  _default: () => `${fieldName}无效`,
  after: (field, [target]) => `${fieldName}必须在${target}之后`,
  alpha_dash: () => `${fieldName}能够包含字母数字字符、破折号和下划线`,
  alpha_num: () => `${fieldName}只能包含字母数字字符`,
  alpha_spaces: () => `${fieldName}只能包含字母字符和空格`,
  alpha: () => `${fieldName}只能包含字母字符`,
  before: (field, [target]) => `${fieldName}必须在${target}之前`,
  between: (field, [min, max]) => `${fieldName}必须在${min}与${max}之间`,
  confirmed: (field, [confirmedField]) => `${fieldName}不能和${confirmedField}匹配`,
  credit_card: () => `${fieldName}格式错误`,
  date_between: (field, [min, max]) => `${fieldName}必须在${min}和${max}之间`,
  date_format: (field, [format]) => `${fieldName}必须符合${format}格式`,
  decimal: (field, [decimals = '*'] = []) => `${fieldName}必须是数字,且能够保留${decimals === '*' ? '' : decimals}位小数`,
  digits: (field, [length]) => `${fieldName}必须是数字,且精确到${length}位数`,
  dimensions: (field, [width, height]) => `${fieldName}必须在${width}像素与${height}像素之间`,
  email: () => `${fieldName}不是一个有效的邮箱`,
  ext: () => `${fieldName}不是一个有效的文件`,
  image: () => `${fieldName}不是一张有效的图片`,
  included: () => `${fieldName}不是一个有效值`,
  integer: () => `${fieldName}必须是整数`,
  ip: () => `${fieldName}不是一个有效的地址`,
  length: (field, [length, max]) => {
   if (max) {
    return `${fieldName}长度必须在${length}到${max}之间`
   }
   return `${fieldName}长度必须为${length}`
  },
  max: (field, [length]) => `${fieldName}不能超过${length}个字符`,
  max_value: (field, [max]) => `${fieldName}必须小于或等于${max}`,
  mimes: () => `${fieldName}不是一个有效的文件类型`,
  min: (field, [length]) => `${fieldName}必须至少有${length}个字符`,
  min_value: (field, [min]) => `${fieldName}必须大于或等于${min}`,
  excluded: () => `${fieldName}不是一个有效值`,
  numeric: () => `${fieldName}只能包含数字字符`,
  regex: () => `${fieldName}格式无效`,
  required: () => `${fieldName}不能为空`,
  size: (field, [size]) => `${fieldName}必须小于${formatFileSize(size)}`,
  url: () => `${fieldName}不是一个有效的url`
 }
})
Vue.use(VeeValidate)

适应UI框架

虽然Vant没有内置验证框架,但提供了错误的样式。

<van-field
 :error="..."
 :error-message="..."
/>

用 vee-validate 可以这样解决

<van-field
 ...
 name="title"
 v-validate="'required|max:20'"
 :error="errors.has('title')"
 :error-message="errors.first('title')"
/>
this.$validator.validateAll().then((result) => {
 if(result){
  // ...
 }
})

分组验证

<van-field
 name="title"
 data-vv-scope="group-1"
 v-validate="'required|max:20'"
 :error="errors.has('group-1.title')"
 :error-message="errors.first('group-1.title')"
/>
this.$validator.validateAll('group-1').then((result) => {
 if(result){
  // ...
 }
})

如此,基于 Vant 的验证框架问题就得以解决了,可以愉快的玩耍表单验证了。

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

Javascript 相关文章推荐
JQuery调webservice实现邮箱验证(检测是否可用)
May 21 Javascript
Javascript基础教程之数组 array
Jan 18 Javascript
JavaScript通过prototype给对象定义属性用法实例
Mar 23 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
May 13 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
May 11 Javascript
jQueryUI Sortable 应用Demo(分享)
Sep 07 jQuery
微信小程序简单实现form表单获取输入数据功能示例
Nov 30 Javascript
解决vue build打包之后首页白屏的问题
Mar 06 Javascript
vue实现添加与删除图书功能
Oct 07 Javascript
zepto.js 实时监听输入框的方法
Dec 04 Javascript
layer弹出层倒计时关闭的实现方法
Sep 27 Javascript
VUE.js实现动态设置输入框disabled属性
Oct 28 Javascript
在Vant的基础上封装下拉日期控件的代码示例
Dec 05 #Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
Dec 05 #Javascript
微信小程序实现图片滚动效果示例
Dec 05 #Javascript
详解vue中的computed的this指向问题
Dec 05 #Javascript
使用rollup打包JS的方法步骤
Dec 05 #Javascript
微信小程序入门之广告条实现方法示例
Dec 05 #Javascript
Vue实现本地购物车功能
Dec 05 #Javascript
You might like
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
yii框架源码分析之创建controller代码
2011/06/28 PHP
php中批量修改文件后缀名的函数代码
2011/10/23 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
共享自己写一个框架DreamScript
2007/01/20 Javascript
JavaScript面象对象设计
2008/04/28 Javascript
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
谈谈JS中的!!
2017/12/07 Javascript
微信小程序中换行空格(多个空格)写法详解
2018/07/10 Javascript
vue路由对不同界面进行传参及跳转的总结
2019/04/20 Javascript
js+canvas实现转盘效果(两个版本)
2020/09/13 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
用Python编程实现语音控制电脑
2014/04/01 Python
Python实现单词翻译功能
2017/06/06 Python
Python 文件操作的详解及实例
2017/09/18 Python
Python 函数list&amp;read&amp;seek详解
2019/08/28 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
Django查询优化及ajax编码格式原理解析
2020/03/25 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
python实现企业微信定时发送文本消息的实例代码
2020/11/25 Python
微软日本官方网站:Microsoft日本
2017/11/26 全球购物
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
小学母亲节活动方案
2014/03/14 职场文书
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
电台编导求职信
2014/05/06 职场文书
代办委托书怎么写
2014/08/01 职场文书
2015年父亲节寄语
2015/03/23 职场文书
大学宣传委员竞选稿
2015/11/19 职场文书
js基础语法与maven项目配置教程案例
2021/07/15 Javascript
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS