React中使用async validator进行表单验证的实例代码
react中进行表单验证毫无疑问是繁琐的,尤其对于动态添加或删除的表单,其验证逻辑更为复杂,目前UI框架使用materialui,但其表单处理不太理想,而后研究了一下另一个UI框架antdesign,其对表单的处理大大方便了逻辑的编写,它使用async-validator处理验证逻辑
目前更换框架毫无疑问是不现实的,于是就想直接引入async-validator,下面描述一个简单的使用,具体信息可以去github上查看
validate.js
importSchemafrom'async-validator'; /* *@paramsform:{ *descriptor:验证规则 *source:待验证字段 *callback:异步验证回调函数 *} * *@returnerrInfo{ *isAllValid:验证是否通过 *errors:验证失败的字段信息 *} *不管验证结果成功还是失败,都会将结果信息写入errors中,方便调用者直接通过数组下标方式获取验证结果信息 **/ functionvalidate(form){ leterrInfo={}; leterrStatus=[]; letdescriptor=form.descriptor; letvalidator=newSchema(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); } }); returnerrInfo; }exportdefaultvalidate;
Form.js
/** *Createdbywxwon18-4-26. */ importReactfrom'react'; import{inject}from'mobx-react'; import{withStyles}from'material-ui/styles'; importvalidatefrom'../utils/validate'; import{formTest2}from'../utils/validateRules'; importInput,{InputLabel}from'material-ui/Input'; import{FormControl,FormHelperText}from'material-ui/Form'; import{MenuItem}from'material-ui/Menu'; importSelectfrom'material-ui/Select'; importButtonfrom'material-ui/Button'; conststyles=theme=>({ container:{ display:'flex', flexWrap:'wrap', }, formControl:{ margin:theme.spacing.unit, }, button:{ margin:theme.spacing.unit, color:'#fff' }, }); @inject('rootStore') @withStyles(styles) classFormTest2extendsReact.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})}); }elseif(field==='age'){ this.setState({age:Object.assign(this.state.age,{value:event.target.value})}); } }; handleCheck=(field)=>()=>{ if(field==='name'){ leterrInfo=validate({ descriptor:formTest2, source:{ name:this.state.name.value, } }); this.setState({name:errInfo.errors[0].message}); }elseif(field==='age'){ leterrInfo=validate({ descriptor:formTest2, source:{ age:this.state.age.value, } }); this.setState({age:errInfo.errors[1].message}); } }; handleSubmit=()=>{ let{name,age}=this.state; leterrInfo=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(Name {name.errMsg} Age {age.errMsg} 提交
exportdefaultFormTest2;
validateRules.js /** *Createdbywxwon18-4-26. */ exportconstformTest2={ 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中使用asyncvalidator进行表单验证的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!