在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 相关文章推荐
Javascript document.referrer判断访客来源网址
May 15 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
Apr 16 Javascript
jquery模拟LCD 时钟的html文件源代码
Jun 16 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
Jul 31 Javascript
利用a标签自动解析URL分析网址实例
Oct 20 Javascript
Bootstrap每天必学之导航条(二)
Mar 01 Javascript
使用three.js 画渐变的直线
Jun 05 Javascript
详解JavaScript中数组的reduce方法
Dec 02 Javascript
基于JS实现的随机数字抽签实例
Dec 08 Javascript
bootstrap modal弹出框的垂直居中
Dec 14 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
Aug 12 Javascript
Ajax实现局部刷新的方法实例
Mar 31 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
摩卡咖啡
2021/03/03 咖啡文化
一个PHP针对数字的加密解密类
2014/03/20 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
简单解决新浪SAE无法上传文件的问题
2015/05/13 PHP
Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解
2017/03/02 PHP
js 表格隔行颜色
2009/12/02 Javascript
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
js实现Select头像选择实时预览代码
2015/08/17 Javascript
Javascript的this用法
2017/01/16 Javascript
纯js实现html转pdf的简单实例(推荐)
2017/02/16 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
2017/02/26 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
2017/08/22 Javascript
Node 自动化部署的方法
2017/10/17 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
[04:37]DOTA2英雄梦之声Vol20发条
2014/06/20 DOTA
python类参数self使用示例
2014/02/17 Python
python分析apache访问日志脚本分享
2015/02/26 Python
Python实现的json文件读取及中文乱码显示问题解决方法
2018/08/06 Python
Python3中bytes类型转换为str类型
2018/09/27 Python
基于Python在MacOS上安装robotframework-ride
2018/12/28 Python
对python3 Serial 串口助手的接收读取数据方法详解
2019/06/12 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
加拿大鞋网:Globo Shoes
2019/12/26 全球购物
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
经典C++面试题一
2016/11/06 面试题
签约仪式主持词
2014/03/19 职场文书
我的中国心演讲稿
2014/09/04 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书
法定代表人证明书
2014/11/28 职场文书
爱心捐书倡议书
2015/04/27 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书
Python基础教程,Python入门教程(超详细)
2021/06/24 Python
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技