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) {
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) {
if
(value) {
callback({
errMsg:
"请输入name"
,
value,
errStatus:
false
}
else
{
callback({
errMsg:
"name不能为空"
,
value,
errStatus:
true
age: {
validator(rule, value, callback, source, options) {
if
(value) {
callback({
errMsg:
"请选择age"
,
value,
errStatus:
false
}
else
{
callback({
errMsg:
"必选项"
,
value,
errStatus:
true
综上为一个小demo,在此基础上可以进行更深层次的封装以便使用
React
本机
表单验证
器
React
Native
表单验证
器是一个简单的库,用于
使用
React
Native来验证您的表单字段。 该库自愿
使用
方便。 您只需要在所需的
React
本机表单组件上扩展“
Valid
ationComponent”类。
运行npm install'
react
-native-form-
valid
a
tor
'来获取库:
npm install '
react
-native-form-
valid
a
tor
' --save
2.在您的应用程序
中
使用
它
在表单组件上扩展“
Valid
ationComponent”类:
import
React
from '
react
' ;
import
Valid
ationComponent from '
react
-native-form-
valid
a
tor
' ;
export default class MyForm exte
let rules = {
name: "required|min:3|max:10|alpha",
username: "required|min:3|max:10|alpha_num",
email: "required|email",
lastName: "required_if:name,naomi",
password: "required|min:8|max:25|alpha_num_punct|confirmed:password_confirmation",
password_confirmation: "required
最近在实际开发
中
遇到需要验证合同编号是否在数据库已经存在,自定义
表单验证
。的
表单验证
大家都知道form绑定rules,prop绑定值与form.值一样,必填,失去焦点触发 提示信息。今天我们讲一讲自定义验证规则具体
使用
场景和它的三个参数意思和
使用
当我们明白了
valid
a
tor
3个参数意思,我们就可以随机组合我们自己的验证规则了自定义验证规则prop绑定值: [console.log('验证规则信息',rule);console.log('输入框的值',rule);
React
-js-验证器
该组件为
react
js提供简单的输入验证。
使用
可以直接
使用
验证功能,也可以
使用
自定义输入
进行
验证。
直接
使用
方法或
使用
下面列出的自定义输入
验证方法:
CustomRx
自定义输入组件:
电子邮件输入
字母数字输入
带有软件包名称的简单命令npm install命令
npm install
react
-js-
valid
a
tor
使用
方法例
iimport
React
, { Component } from '
react
';
import Container from '../Containers/Container';
import { Email,Numeric,Letter,AlphaNumeric,CustomRx,Required } from '
react
-js-
valid
a
tor
'
class
valid
a
tor
: (_, value) => {
return value.length > 20 ? Promise.reject('分类名称不能超过20个字符') : Promis...
react
指令封装 -
valid
a
tor
校验
React
valid
a
tor
封装因form表单校验,可以引入针对于form表单的校验,但是个人嫌弃其他文件的校验方式引用文件比较大,所以自己封装了个简单的检验方式,而
react
又没有指令这个概念,所以个人仿照vue 的指令,简单的封装 了一个
valid
a
tor
的检验方式。优点:1、体积小,未压缩前3k,简单实现了非空校验跟正则校验。2、相对
React
.PropTypes 在
React
v15.5 版本后已经移到了 prop-types 库。
<script src="https://cdn.bootcss.com/prop-types/15.6.1/prop-types.js"></script>
Props 验证
使用
propTypes,它可以保证我们的应用组件被正确
使用
,
React
.PropTypes...
{ required: true, message: '用户名不能为空' },
{ min: 4, message: '用户名至少4位' },
{ max: 12, message: '用户名至多12位' },
{ pattern: /^[a-zA-Z0-9_]+$/, message: '用户名必须需是英文,数字或下划线组成' },
自定义
valid
a
tor
写法
valid
atePwd =
async
(rule, v
labelCol={{ span: 8, offset: 2 }}
wrapperCol={{ span: 14, offset: 0 }}
rules={[{ required: true }, { pattern: /^[0-9]*$/, message: '必须是数字格式' }]}