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 相关文章推荐
Extjs Ajax 乱码问题解决方案
Apr 15 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
Oct 11 Javascript
基于JQuery的asp.net树实现代码
Nov 30 Javascript
jQuery Ajax 实例全解析
Apr 20 Javascript
如何在一个页面显示多个百度地图
Apr 07 Javascript
jQuery实现的简洁下拉菜单导航效果代码
Aug 26 Javascript
一分钟理解js闭包
May 04 Javascript
js变量提升深入理解
Sep 16 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
Dec 18 Javascript
基于jQuery实现顶部导航栏功能
Dec 27 Javascript
基于JavaScript实现弹幕特效
Aug 27 Javascript
Vue项目中ESlint规范示例代码
Jul 04 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
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
ThinkPHP路由机制简介
2016/03/23 PHP
ThinkPHP打水印及设置水印位置的方法
2016/10/14 PHP
提高网站信任度的技巧
2008/10/17 Javascript
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
jquery实现图片左右间隔滚动特效(可自动播放)
2013/05/08 Javascript
5分钟理解JavaScript中this用法分享
2013/11/09 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
2016/05/20 Javascript
js实时获取窗口大小变化的实例代码
2016/11/18 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
[02:25]DOTA2英雄基础教程 熊战士
2014/01/03 DOTA
解密Python中的描述符(descriptor)
2015/06/03 Python
Python编写电话薄实现增删改查功能
2016/05/07 Python
python字典快速保存于读取的方法
2018/03/23 Python
Python读取properties配置文件操作示例
2018/03/29 Python
python实现txt文件格式转换为arff格式
2018/05/31 Python
Python逐行读取文件中内容的简单方法
2019/02/26 Python
python仿抖音表白神器
2019/04/08 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
2019/08/09 Python
python 中的paramiko模块简介及安装过程
2020/02/29 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
零基础学Python之前需要学c语言吗
2020/07/21 Python
python hmac模块验证客户端的合法性
2020/11/07 Python
HTML5的革新 结构之美
2011/06/20 HTML / CSS
美国婚礼装饰和活动用品批发供应商:Event Decor Direct
2018/10/12 全球购物
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
英文版销售经理个人求职信
2013/11/20 职场文书
2014年党员学习“三严三实”思想汇报
2014/09/15 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书
Mybatis-plus在项目中的简单应用
2021/07/01 Java/Android
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python
pandas中对文本类型数据的处理小结
2021/11/01 Python