在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 相关文章推荐
js setTimeout opener的用法示例详解
Oct 23 Javascript
jquery解析XML字符串和XML文件的方法说明
Feb 21 Javascript
BootStrap中Tab页签切换实例代码
May 30 Javascript
AngularJs篇:使用AngularJs打造一个简易权限系统的实现代码
Dec 26 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
Jan 13 Javascript
深入理解node.js之path模块
May 03 Javascript
jQuery ajax动态生成table功能示例
Jun 14 jQuery
基于vue配置axios的方法步骤
Nov 09 Javascript
简单的Vue异步组件实例Demo
Dec 27 Javascript
bootstrap 点击空白处popover弹出框隐藏实例
Jan 24 Javascript
原生JS实现汇率转换功能代码实例
May 13 Javascript
Vue.js使用axios动态获取response里的data数据操作
Sep 08 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 split汉字
2009/06/05 PHP
php解决DOM乱码的方法示例代码
2016/11/20 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
javascript StringBuilder类实现
2008/12/22 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
document.getElementBy(&quot;id&quot;)与$(&quot;#id&quot;)有什么区别
2013/09/22 Javascript
node.js中的console.trace方法使用说明
2014/12/09 Javascript
JavaScript动态创建div等元素实例讲解
2016/01/06 Javascript
内容滑动切换效果jquery.hwSlide.js插件封装
2016/07/07 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
ztree实现权限横向显示功能
2017/05/20 Javascript
原生js实现抽奖小游戏
2019/06/27 Javascript
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
[04:05]TI9战队采访 - Natus Vincere
2019/08/22 DOTA
Python文件及目录操作实例详解
2015/06/04 Python
详解常用查找数据结构及算法(Python实现)
2016/12/09 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
python使用matplotlib库生成随机漫步图
2018/08/27 Python
python重试装饰器的简单实现方法
2019/01/31 Python
详解Python3中setuptools、Pip安装教程
2019/06/18 Python
Python opencv相机标定实现原理及步骤详解
2020/04/09 Python
打印tensorflow恢复模型中所有变量与操作节点方式
2020/05/26 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
2020/08/03 Python
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
2013/01/31 HTML / CSS
详解HTML5中的元素与元素
2015/08/17 HTML / CSS
意大利奢侈品购物网站:Deliberti
2019/10/08 全球购物
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
决定成败的关键——创业计划书
2014/01/24 职场文书
学习十八大报告感言
2014/02/04 职场文书
保险内勤岗位职责
2014/04/05 职场文书