Vue.js如何优雅的进行form validation


Posted in Javascript onApril 07, 2017

本文针对知乎上关于Vue.js如何优雅的进行form validation问题进行了整理,供大家参考,具体内容如下

Vue.js如何优雅的进行form validation?

1. 所有validation rules是被集中管理,而不是每个文件自己一种,导致验证规则冗余。
2. 能够进行remote validate。
3. 不用JQuery。

现有的插件vuejs/vue-validator · GitHub只能实现普通验证,但如何解决1,因为vue-validator没有把校验规则给抽象出来,没办法,现在只能自己代码上再抽出一层rules来管理。remote validation只能手写借助Jquery ajax来验证。

网友1、曾广营

这个现在我可以回答了。

我觉得 vue-validator 太冗余了。所以自己写了个项目用的插件 va.js,它实现了

集中式的管理 校验规则 和 报错模板。

报错时机可选

校验正确后的数据,已经打包成对象,可以直接用

允许各个页面对规则进行覆盖,对报错信息进行自定义修改,以及允许ajax获取数据后,再对规则进行补充

按顺序来校验报错

我写了一篇博文来记载

我个人观点。表单验证的是一种高度定制化的东东。所以网上用的插件,都会有不尽人意的感觉,因为要么冗余,要么不够。因此,我分享了思路和源码。真的想写的话,借鉴思路自己写吧。

补充:

1.自定义的js函数规则,可以自己再加入。 有个存储校验函数的对象,可以扩展。
2.对ajax的处理仅仅是暴露通过校验的数据的对象。即假如在ajax前不需验证的话,这份暴露出来的数据是可以提交的;假如需要验证,可以使用这个暴露出来的数据,对单个或多个字段加上额外的校验。 

网友2、冉聪杰

推荐:vee-validate https://github.com/logaretm/vee-validate/

网友3、李文富

自己简单写一个,支持异步,支持任意 Vue Component,不限定于 Form Element。

来自:https://github.com/crossjs/plato/blob/master/src/modules/validator/index.js

看 return 部分即可:

import Vue from 'vue'
import * as rules from './rules'
import promisify from 'util/promisify'

export default (context, options = {}) => {
 // options = { scope: 'validator', prefix: '/', ...options }

 // 只注册回调,不注册数据
 return () => {
 Vue.mixin({
  beforeCreate () {
  const options = this.$options
  const { validator } = options

  if (validator) {
   // 在入口处定义 $validation
   Vue.util.defineReactive(this, '$validation', {
   fields: [],
   errors: []
   })
   this.$validator = this
   nextTick(this, validator.auto)
  } else {
   const { parent } = options
   if (parent && parent.$validation) {
   this.$validation = parent.$validation
   this.$validator = parent.$validator
   nextTick(this, parent.$validator.$options.validator.auto)
   }
  }
  }
 })

 /**
  * $validate
  *
  * validate vm recursively.
  *
  * @return {Promise}
  */
 Vue.prototype.$validate = function (fromEntry) {
  const { validate, $validation = {}, $validator } = this

  // 如果此处为校验入口
  if ($validator === this && !fromEntry) {
  // 顶级往下校验所有子组件
  return Promise.all($validation.fields
   .map(field => field.$validate(true)))
   .then(() => $validation)
   .catch(() => Promise.reject($validation))
  } else {
  if (!validate) {
   return Promise.resolve($validation)
  }
  return Promise.all(Object.keys(validate).map(key => {
   return new Promise((resolve, reject) => {
   const { validator = rules[key], rule, message } = validate[key]
   if (validator) {
    // reject if falsy
    promisify(validator(this.value, rule), true)
    .then(resolve)
    .catch(() => {
     reject({
     field: this.field || this,
     rule,
     message
     })
    })
   } else {
    __PROD__ || console.warn(`'${key}' is NOT a valid validator`)
    resolve()
   }
   })
  })).then(() => {
   updateErrors($validation.errors, this)
   return $validation
  }).catch(error => {
   updateErrors($validation.errors, this, error)
   return Promise.reject($validation)
  })
  }
 }

 function updateErrors (errors, vm, replacement) {
  const field = vm.field || vm
  const found = errors.some((error, index) => {
  if (error.field === field) {
   if (replacement) {
   errors.splice(index, 1, replacement)
   } else {
   errors.splice(index, 1)
   }
   return true
  }
  return false
  })

  if (!found && replacement) {
  errors.push(replacement)
  }

  return errors
 }

 function nextTick (vm, auto) {
  vm.$nextTick(() => {
  // 定义了校验规则
  if (vm.validate) {
   vm.$validation.fields.push(vm)
   // 加载完成自动检查
   if (auto) {
   vm.$validate()
   }
  }
  })
 }
 }
}

还有一个网友推荐的:试试这个自带气泡提示的vue校验插件,配合vue-hook-form能够轻松实现表单校验

以上就是整理的关于此类问题的几个不错的回答,如果大家有更好的答案欢迎分享,希望本文对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript实现的鼠标链接提示效果生成器代码
Jun 28 Javascript
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
Jun 02 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
Aug 18 Javascript
js中定义一个变量并判断其是否为空的方法
May 13 Javascript
js中各种类型的变量在if条件中是true还是false
Jul 16 Javascript
JS实现的用来对比两个用指定分隔符分割的字符串是否相同
Sep 19 Javascript
JavaScript html5 canvas实现图片上画超链接
Oct 20 Javascript
使用vue-cli+webpack搭建vue开发环境的方法
Dec 22 Javascript
小程序图片剪裁加旋转的示例代码
Jul 10 Javascript
mpvue 如何使用腾讯视频插件的方法
Jul 16 Javascript
layer ui插件显示tips时,修改字体颜色的实现方法
Sep 11 Javascript
javascript实现滚轮轮播图片
Dec 13 Javascript
详解Node.js实现301、302重定向服务
Apr 07 #Javascript
Express URL跳转(重定向)的实现方法
Apr 07 #Javascript
微信小程序 首页制作简单实例
Apr 07 #Javascript
微信小程序 商城开发(ecshop )简单实例
Apr 07 #Javascript
js控制文本框禁止输入特殊字符详解
Apr 07 #Javascript
ES6学习笔记之Set和Map数据结构详解
Apr 07 #Javascript
Vue表单验证插件Vue Validator使用方法详解
Apr 07 #Javascript
You might like
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
2018/10/10 PHP
php 中序列化和json使用介绍
2013/07/08 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
2017/03/02 Javascript
解决layui弹框失效的问题
2019/09/09 Javascript
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
Vue实现todo应用的示例
2021/02/20 Vue.js
python实现简单socket程序在两台电脑之间传输消息的方法
2015/03/13 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
Python编写打字训练小程序
2019/09/26 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
基于pycharm实现批量修改变量名
2020/06/02 Python
python 获取谷歌浏览器保存的密码
2021/01/06 Python
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
详解Html5 监听拦截Android返回键方法
2018/04/18 HTML / CSS
美国休闲服装品牌:J.Crew Factory
2017/03/04 全球购物
印度在线杂货店:bigbasket
2018/08/23 全球购物
Hoka One One法国官网:美国专业跑鞋品牌
2018/12/29 全球购物
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
专科毕业生学习生活的自我评价
2013/10/26 职场文书
大学校园生活自我鉴定
2014/01/13 职场文书
业务总经理岗位职责
2014/02/03 职场文书
小班评语大全
2014/05/04 职场文书
市场营销工作计划书
2014/05/06 职场文书
三好生演讲稿
2014/09/12 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
秋季运动会开幕词
2015/01/28 职场文书
党小组考察意见
2015/06/02 职场文书
停发工资证明范本
2015/06/12 职场文书
计算机实训心得体会
2016/01/14 职场文书
Django如何创作一个简单的最小程序
2021/05/12 Python
Pytorch 实现变量类型转换
2021/05/17 Python
CSS中Single Div 绘图技巧的实现
2021/06/18 HTML / CSS