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 相关文章推荐
为Yahoo! UI Extensions Grid增加内置的可编辑器
Mar 10 Javascript
javascript代码加载优化方法
Jan 30 Javascript
node.js中的fs.close方法使用说明
Dec 17 Javascript
jQuery插件EasyUI设置datagrid的checkbox为禁用状态的方法
Aug 05 Javascript
基于jquery二维码生成插件qrcode
Jan 07 Javascript
jquery easyui DataGrid简单示例
Jan 23 Javascript
js 实现复选框只能选择一项的示例代码
Jan 23 Javascript
Vuex mutitons和actions初使用详解
Mar 04 Javascript
简单了解Ajax表单序列化的实现方法
Jun 14 Javascript
JS控制只能输入数字并且最多允许小数点两位
Nov 24 Javascript
Node.js操作MongoDB数据库实例分析
Jan 19 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
Sep 10 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中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
2011/03/23 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
2013/06/27 PHP
浅谈php和.net的区别
2014/09/28 PHP
php运行时动态创建函数的方法
2015/03/16 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
extjs 学习笔记 四 带分页的grid
2009/10/20 Javascript
使用原生JS实现弹出层特效
2014/12/22 Javascript
js钢琴按钮波浪式图片排列效果代码分享
2015/08/26 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
bootstrap使用validate实现简单校验功能
2016/12/02 Javascript
详解webpack分包及异步加载套路
2017/06/29 Javascript
js实现图片上传预览原理分析
2017/07/13 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
JavaScript实现旋转木马轮播图
2020/03/16 Javascript
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
Python实现mysql数据库更新表数据接口的功能
2017/11/19 Python
利用Python进行异常值分析实例代码
2017/12/07 Python
Python 函数基础知识汇总
2018/03/09 Python
简单了解python数组的基本操作
2019/11/26 Python
python实现处理mysql结果输出方式
2020/04/09 Python
django rest framework 过滤时间操作
2020/07/12 Python
荷兰最大的儿童服装店:The Kids Republic
2019/04/13 全球购物
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
中职生自荐信范文
2014/06/15 职场文书
学用政策心得体会
2014/09/10 职场文书
信访工作个人总结
2015/03/03 职场文书
心灵捕手观后感
2015/06/02 职场文书
银行文明优质服务培训心得体会
2016/01/09 职场文书
详解Vue的options
2021/05/15 Vue.js
七个非常实用的Python工具包总结
2021/06/15 Python
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS
使用Python解决图表与画布的间距问题
2022/04/11 Python