React中使用async validator进行表单验证的实例代码


Posted in Javascript onAugust 17, 2018

react中进行表单验证毫无疑问是繁琐的,尤其对于动态添加或删除的表单,其验证逻辑更为复杂, 目前UI框架使用material ui ,但其表单处理不太理想,而后研究了一下另一个UI 框架 ant design, 其对表单的处理大大方便了逻辑的编写, 它使用async-validator处理验证逻辑

目前更换框架毫无疑问是不现实的,于是就想直接引入async-validator,下面描述一个简单的使用,具体信息可以去github上查看

validate.js

import Schema from 'async-validator';
/*
* @params form: {
*  descriptor: 验证规则
*  source: 待验证字段
*  callback: 异步验证回调函数
* }
*
* @return errInfo {
*  isAllValid: 验证是否通过
 * errors: 验证失败的字段信息
* }
* 不管验证结果成功还是失败,都会将结果信息写入errors中,方便调用者直接通过数组下标方式获取验证结果信息
* */
function validate (form) {
  let errInfo = {};
  let errStatus = [];
  let descriptor = form.descriptor;
  let validator = new Schema(descriptor);
  validator.validate(form.source, {
    firstFields: true // 如果一个字段对应多个验证规则, 只显示验证失败的第一个规则信息,并不再进行后续规则的验证
  }, (errors, fields) => {
    if (errors) {
      /* 如需异步验证需要传入回调函数callback */
      errors.forEach(item => {
        errStatus.push(item.message.errStatus);
      });
      errInfo.errors = errors;
      errInfo.isAllValid = !errStatus.includes(true);
      form.callback && form.callback(errInfo);
    }
  });
  return errInfo;
}export default validate;

Form.js

/**
 * Created by wxw on 18-4-26.
 */
import React from 'react';
import {inject} from 'mobx-react';
import { withStyles } from 'material-ui/styles';
import validate from '../utils/validate';
import {formTest2} from '../utils/validateRules';
import Input, { InputLabel } from 'material-ui/Input';
import { FormControl, FormHelperText } from 'material-ui/Form';
import { MenuItem } from 'material-ui/Menu';
import Select from 'material-ui/Select';
import Button from 'material-ui/Button';
const styles = theme => ({
  container: {
    display: 'flex',
    flexWrap: 'wrap',
  },
  formControl: {
    margin: theme.spacing.unit,
  },
  button: {
    margin: theme.spacing.unit,
    color: '#fff'
  },
});
@inject('rootStore')
@withStyles(styles)
class FormTest2 extends React.Component {
  state = {
    name: {
      value: '',
      errStatus: false,
      errMsg: '请输入name'
    },
    age: {
      value: '',
      errStatus: false,
      errMsg: '请选择age'
    }
  };
  handleChange =(field) => event => {
    if (field === 'name') {
      this.setState({ name: Object.assign(this.state.name, {value: event.target.value}) });
    } else if (field === 'age') {
      this.setState({ age: Object.assign(this.state.age, {value: event.target.value}) });
    }
  };
  handleCheck = (field) => () => {
    if (field === 'name') {
      let errInfo = validate({
        descriptor: formTest2,
        source: {
          name: this.state.name.value,
        }
      });
      this.setState({ name: errInfo.errors[0].message});
    } else if (field === 'age') {
      let errInfo = validate({
        descriptor: formTest2,
        source: {
          age: this.state.age.value,
        }
      });
      this.setState({ age: errInfo.errors[1].message });
    }
  };
  handleSubmit = () => {
    let {name, age} = this.state;
    let errInfo = validate({
      descriptor: formTest2,
      source: {
        name: name.value,
        age: age.value
      }
    });
    errInfo.errors.forEach(item => {
      this.setState({
        [item.field]: item.message
      });
    });
    if (errInfo.isAllValid) {
      console.log('验证成功');
    } else {
      console.log('验证失败');
    }
  };
  render () {
    const { classes } = this.props;
    const {name, age} = this.state;
    return (
      <div className="form2">
        <FormControl className={classes.formControl} error={name.errStatus}>
          <InputLabel htmlFor="name-simple">Name</InputLabel>
          <Input id="name-simple" value={name.value} onChange={this.handleChange('name')} placeholder="placeholder" onBlur={this.handleCheck('name')} />
          <FormHelperText id="name-simple">{name.errMsg}</FormHelperText>
        </FormControl>
        <FormControl className={classes.formControl} error={age.errStatus}>
          <InputLabel htmlFor="age-simple">Age</InputLabel>
          <Select
            value={age.value}
            onChange={this.handleChange('age')}
            onBlur={this.handleCheck('age')}
            inputProps={{
              name: 'age',
              id: 'age-simple',
            }}
          >
            <MenuItem value={10}>Ten</MenuItem>
            <MenuItem value={20}>Twenty</MenuItem>
            <MenuItem value={30}>Thirty</MenuItem>
          </Select>
          <FormHelperText id="age-simple">{age.errMsg}</FormHelperText>
        </FormControl>
        <Button variant="raised" color="primary" className={classes.button} onClick={this.handleSubmit}>
          提交
        </Button>
      </div>
    )
  }
}

export default FormTest2;

validateRules.js
/**
 * Created by wxw on 18-4-26.
 */
export const formTest2 = {
  name: {
    validator(rule, value, callback, source, options) {
      /* callback必须执行一次,带参数为错误信息,不带参数为正确 */
      if (value) {
        callback({
          errMsg: "请输入name",
          value,
          errStatus: false
        });
      } else {
        callback({
          errMsg: "name不能为空",
          value,
          errStatus: true
        });
      }
    }
  },
  age: {
    validator(rule, value, callback, source, options) {
      /* callback必须执行一次,带参数为错误信息,不带参数为正确 */
      if (value) {
        callback({
          errMsg: "请选择age",
          value,
          errStatus: false
        });
      } else {
        callback({
          errMsg: "必选项",
          value,
          errStatus: true
        });
      }
    }
  },
};

综上为一个小demo,在此基础上可以进行更深层次的封装以便使用。

总结

以上所述是小编给大家介绍的React中使用async validator进行表单验证的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
基于jquery的lazy loader插件实现图片的延迟加载[简单使用]
May 07 Javascript
《JavaScript函数式编程》读后感
Aug 07 Javascript
javascript实现tab响应式切换特效
Jan 29 Javascript
大型JavaScript应用程序架构设计模式
Jun 29 Javascript
JavaScript动态添加事件之事件委托
Jul 12 Javascript
bootstrapValidator表单验证插件学习
Dec 30 Javascript
jQuery为DOM动态追加事件的方法
Feb 16 Javascript
JavaScript中三个等号和两个等号你了解多少
Jul 04 Javascript
基于Vue实例生命周期(全面解析)
Aug 16 Javascript
react同构实践之实现自己的同构模板
Mar 13 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
Sep 18 Javascript
vue之a-table中实现清空选中的数据
Nov 07 Javascript
JavaScript实现构造json数组的方法分析
Aug 17 #Javascript
layer弹出层父子页面事件相互调用方法
Aug 17 #Javascript
layer.open 按钮的点击事件关闭方法
Aug 17 #Javascript
layer弹出层全屏及关闭方法
Aug 17 #Javascript
vue+iview+less 实现换肤功能
Aug 17 #Javascript
jquery实现的简单轮播图功能【适合新手】
Aug 17 #jQuery
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
Aug 17 #Javascript
You might like
php 常用字符串函数总结
2008/03/15 PHP
PHP运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
深入extjs与php参数交互的详解
2013/06/25 PHP
php socket客户端及服务器端应用实例
2014/07/04 PHP
Smarty变量用法详解
2016/05/11 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
2016/11/05 PHP
javascript时间自动刷新实现原理与步骤
2013/01/06 Javascript
纯javascript实现自动发送邮件
2015/10/21 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
解决jquery无法找到其他父级子集问题的方法
2016/05/10 Javascript
Nodejs中 npm常用命令详解
2016/07/04 NodeJs
javascript时间差插件分享
2016/07/18 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
详解vue.js的事件处理器v-on:click
2017/06/27 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
vue弹窗组件使用方法
2018/04/28 Javascript
vue使用codemirror的两种用法
2019/08/27 Javascript
解决axios post 后端无法接收数据的问题
2019/10/29 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
2018/07/26 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
Python使用psutil获取进程信息的例子
2019/12/17 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
校园之星获奖感言
2014/01/29 职场文书
教师校本培训方案
2014/02/26 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
模特大赛策划方案
2014/05/28 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
2016学雷锋优秀志愿者事迹材料
2016/02/25 职场文书
golang 实现并发求和
2021/05/08 Golang
实现一个简单得数据响应系统
2021/11/11 Javascript
Vue3中的Refs和Ref详情
2021/11/11 Vue.js
Python Pandas 删除列操作
2022/03/16 Python