视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
在Vant的基础上实现添加表单验证框架的方法示例
2020-11-27 22:02:53 责编:小采
文档


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 的验证框架问题就得以解决了,可以愉快的玩耍表单验证了。

    下载本文
    显示全文
    专题