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中Array 对象相关的几个方法
Dec 22 Javascript
详细讲解JS节点知识
Jan 31 Javascript
chrome原生方法之数组
Nov 30 Javascript
JavaScript File分段上传
Mar 10 Javascript
js精准的倒计时函数分享
Jun 29 Javascript
jQuery操作json常用方法示例
Jan 04 Javascript
js实现添加删除表格(两种方法)
Apr 27 Javascript
纯js实现页面返回顶部的动画(超简单)
Aug 10 Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
Oct 26 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
Feb 21 Javascript
Ant Design的可编辑Tree的实现操作
Oct 31 Javascript
一篇文章弄清楚Ajax请求的五个步骤
Mar 17 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创建动态图像
2006/10/09 PHP
php 阴历-农历-转换类代码
2012/01/16 PHP
php生成rss类用法实例
2015/04/14 PHP
如何利用PHP实现上传图片功能详解
2020/09/24 PHP
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
2012/02/23 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
2015/04/07 Javascript
JavaScript实现动态添加,删除行的方法实例详解
2015/07/02 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
jQuery实现可以控制图片旋转角度效果(附demo源码下载)
2016/01/27 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
python实现中文输出的两种方法
2015/05/09 Python
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
Python for Informatics 第11章 正则表达式(一)
2016/04/21 Python
python 生成器生成杨辉三角的方法(必看)
2017/04/10 Python
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
matplotlib简介,安装和简单实例代码
2017/12/26 Python
python中set()函数简介及实例解析
2018/01/09 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
解析python实现Lasso回归
2019/09/11 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
Probikekit日本:自行车套件,跑步和铁人三项装备
2017/04/03 全球购物
教你打造完美的创业计划书
2014/01/06 职场文书
《问银河》教学反思
2014/02/19 职场文书
护士演讲稿优秀范文
2014/04/30 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
五年级上册复习计划
2015/01/19 职场文书
2016寒假社会实践心得体会范文
2015/10/09 职场文书
php+laravel 扫码二维码签到功能
2021/05/15 PHP
详解缓存穿透击穿雪崩解决方案
2021/05/28 Redis
python之django路由和视图案例教程
2021/07/26 Python