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 相关文章推荐
语义化 H1 标签
Jan 14 Javascript
帮助避免错误的Javascript陷阱清单
May 31 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
Aug 29 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
Sep 29 Javascript
Json实现异步请求提交评论无需跳转其他页面
Oct 11 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
Aug 24 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
Sep 04 Javascript
详解tween.js的使用教程
Sep 14 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
Feb 02 Javascript
老生常谈JS中的继承及实现代码
Jul 06 Javascript
vue操作下拉选择器获取选择的数据的id方法
Aug 24 Javascript
让JavaScript代码更加精简的方法技巧
Jun 01 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 闭包特性在实际应用中的问题
2009/10/30 PHP
PHP设置图片文件上传大小的具体实现方法
2013/10/11 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
js过滤数组重复元素的方法
2010/09/05 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
jQuery统计上传文件大小的方法
2015/01/24 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
JavaScript设计模式经典之工厂模式
2016/02/24 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
AngularJS基础 ng-include 指令示例讲解
2016/08/01 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
js css自定义分页效果
2017/02/24 Javascript
nodejs实现的简单web服务器功能示例
2018/03/15 NodeJs
浅谈JS对象添加getter与setter的5种方法
2018/06/09 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
js module大战
2019/04/19 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
Openlayers显示瓦片网格信息的方法
2020/09/28 Javascript
在类Unix系统上开始Python3编程入门
2015/08/20 Python
详解python开发环境搭建
2016/12/16 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
Python使用sorted对字典的key或value排序
2018/11/15 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
《兰亭集序》教学反思
2014/02/11 职场文书
歌唱比赛主持词
2014/03/18 职场文书
好书伴我成长演讲稿
2014/05/14 职场文书
图书馆志愿者活动总结
2014/06/27 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
关于Javascript闭包与应用的详解
2021/04/22 Javascript
SQL实现LeetCode(196.删除重复邮箱)
2021/08/07 MySQL
将MySQL的表数据全量导入clichhouse库中
2022/03/21 MySQL