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 设计模式学习 Singleton
Jul 27 Javascript
jquery插件制作简单示例说明
Feb 03 Javascript
js中的布尔运算符使用介绍
Nov 20 Javascript
checkbox全选所涉及到的知识点介绍
Dec 31 Javascript
javascript html5摇一摇功能的实现
Apr 19 Javascript
js控制div层的叠加简单方法
Oct 15 Javascript
jQuery基于cookie实现换肤功能实例
Oct 14 jQuery
通过vue-cli来学习修改Webpack多环境配置和发布问题
Dec 22 Javascript
Vue文件配置全局变量的实例
Sep 06 Javascript
angularjs使用div模拟textarea文本框的方法
Oct 02 Javascript
Vue的路由及路由钩子函数的实现
Jul 02 Javascript
javascript的setTimeout()使用方法总结
Nov 20 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/06/02 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
2017/10/23 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
JavaScript插件化开发教程(六)
2015/02/01 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
Json解析的方法小结
2016/06/22 Javascript
EasyUI实现下拉框多选功能
2017/11/07 Javascript
VUE element-ui 写个复用Table组件的示例代码
2017/11/18 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
2019/05/16 Javascript
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
js实现网页版贪吃蛇游戏
2020/02/22 Javascript
python时间整形转标准格式的示例分享
2014/02/14 Python
Python中正则表达式的详细教程
2015/04/30 Python
django实现分页的方法
2015/05/26 Python
python随机取list中的元素方法
2018/04/08 Python
对python中的pop函数和append函数详解
2018/05/04 Python
对python制作自己的数据集实例讲解
2018/12/12 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
linux面试题参考答案(4)
2013/01/28 面试题
预备党员思想汇报范文
2013/12/29 职场文书
国际贸易专业求职信
2014/06/04 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
预备党员半年考察意见
2015/06/01 职场文书
Mysql忘记密码解决方法
2022/02/12 MySQL
Python实战之大鱼吃小鱼游戏的实现
2022/04/01 Python
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers