在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 相关文章推荐
IE autocomplete internet explorer's autocomplete
Jun 30 Javascript
WordPress 照片lightbox效果的运用几点
Jun 22 Javascript
jquery下onpropertychange事件的绑定方法
Aug 01 Javascript
查看大图功能代码jquery版
Nov 05 Javascript
12个超实用的JQuery代码片段
Nov 02 Javascript
js和jquery实现监听键盘事件示例代码
Jun 24 Javascript
ajax在兼容模式下失效的快速解决方法
Mar 22 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
Dec 24 Javascript
微信小程序 转发功能的实现
Aug 04 Javascript
详解Vue2 SSR 缓存 Api 数据
Nov 20 Javascript
vue将文件/图片批量打包下载zip的教程
Oct 21 Javascript
vue中使用腾讯云Im的示例
Oct 23 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检测网页是否被百度收录的函数代码
2013/10/09 PHP
带密匙的php加密解密示例分享
2014/01/29 PHP
Smarty模板引擎缓存机制详解
2016/05/23 PHP
PHP7多线程搭建教程
2017/04/21 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
php7 新增功能实例总结
2020/05/25 PHP
拖动一个HTML元素
2006/12/22 Javascript
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
Jquery实现简单的动画效果代码
2012/03/18 Javascript
javascript学习笔记(九) js对象 设计模式
2012/06/19 Javascript
基于jquery创建的一个图片、视频缓冲的效果样式插件
2012/08/28 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
2014/01/07 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
Vue.js常用指令之循环使用v-for指令教程
2017/06/27 Javascript
JS实现合并json对象的方法
2017/10/10 Javascript
js中this对象用法分析
2018/01/05 Javascript
微信小程序支付PHP代码
2018/08/23 Javascript
react脚手架如何配置less和ant按需加载的方法步骤
2018/11/28 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
vue界面发送表情的实现代码
2020/09/11 Javascript
小程序实现上下切换位置
2020/11/16 Javascript
编写Python CGI脚本的教程
2015/06/29 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
python修改txt文件中的某一项方法
2018/12/29 Python
python爬虫要用到的库总结
2020/07/28 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
岗位职责的构建方法
2014/02/01 职场文书
水电维修专业推荐信
2014/09/06 职场文书
使用 Docker Compose 构建复杂的多容器App
2022/04/30 Servers