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 相关文章推荐
jquery获取元素索引值index()示例
Feb 13 Javascript
JS中怎样判断undefined(比较不错的方法)
Mar 27 Javascript
javascript跨域的4种方法和原理详解
Apr 08 Javascript
javascript中hasOwnProperty() 方法使用指南
Mar 09 Javascript
果断收藏9个Javascript代码高亮脚本
Jan 06 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
Aug 10 Javascript
jquery文字填写自动高度的实现方法
Nov 07 Javascript
Vue实战之vue登录验证的实现代码
Oct 31 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
May 23 jQuery
移动端手指操控左右滑动的菜单
Sep 08 Javascript
15分钟学会vue项目改造成SSR(小白教程)
Dec 17 Javascript
Windows下安装 node 的版本控制工具 nvm
Feb 06 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
做个自己站内搜索引擎
2006/10/09 PHP
ThinkPHP让分页保持搜索状态的方法
2014/07/02 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
解决php写入数据库乱码的问题
2019/09/17 PHP
PHP实现随机发放扑克牌
2020/04/21 PHP
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
ejs v9 javascript模板系统
2012/03/21 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
2013/06/14 Javascript
Firefox中使用outerHTML的2种解决方法
2014/06/07 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
详解javascript new的运行机制
2016/01/26 Javascript
JS动态改变浏览器标题的方法
2016/04/06 Javascript
详解Vue自定义过滤器的实现
2017/01/10 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
2017/02/11 Javascript
javascript设计模式之模块模式学习笔记
2017/02/15 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
jquery应用实例分享_实现手风琴特效
2018/02/01 jQuery
vue axios 简单封装以及思考
2018/10/09 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
pandas数据分组和聚合操作方法
2018/04/11 Python
Python判断有效的数独算法示例
2019/02/23 Python
Python实现微信消息防撤回功能的实例代码
2019/04/29 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
CSS3 二级导航菜单的制作的示例
2018/04/02 HTML / CSS
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
建筑毕业生自我鉴定
2013/10/18 职场文书
趣味比赛活动方案
2014/02/15 职场文书
办公室文员岗位职责范本
2014/06/12 职场文书
个人委托书范文
2015/01/28 职场文书
使用vue-element-admin框架从后端动态获取菜单功能的实现
2021/04/29 Vue.js
MySQL脏读,幻读和不可重复读
2022/05/11 MySQL