A Higher Order Component to build form & input, support validators.
A Higher Order Component to build form &input, support validators.
一个 React 高阶组件(HOC),用来方便的创建表单,支持各类表单验证,支持异步验证。
react-easyform 已经停止维护,请切换到 react-formutil
npm install --save react-easyform
import React, { Component, PropTypes } from 'react';
import EasyForm, { Field, FieldGroup } from 'react-easyform';
class Form extends Component {
submit = ev => {
alert('submit!');
};
render() {
// 经过EasyForm包装的组件,props里会有一个params属性,包含所有的表单项值
const { params } = this.props.params;
/*
* props里的easyform对象,包含了一组验证结果,
* 其中$invalid/$valid 可以用来判断表单项是够已经正确填写
*/
const { $invalid } = this.props.easyform.$invalid;
return (
<form className="" onSubmit={this.submit}>
<Field
type="text"
name="username"
required
pattern={/^[\w]{5,10}$/}
validMessage={{ required: '请填写用户名', pattern: '用户名不能包含字母数字下划线以外的字符' }}
></Field>
<Field type="text" name="password" required validMessage={{ required: '请填写密码' }} ></Field>
<button className="btn-submit" disabled={$invalid ? 'disabled' : false}>
提交
</button>
</form>
);
}
}
export default EasyForm(Form);
import React, { Component, PropTypes } from 'react';
import EasyForm, { Field, FieldGroup } from 'react-easyform';
class Form extends Component {
submit = ev => {
alert('submit!');
};
render() {
// 经过EasyForm包装的组件,props里会有一个params属性,包含所有的表单项值
const { params } = this.props.params;
/*
* props里的easyform对象,包含了一组验证结果,
* 其中$invalid/$valid 可以用来判断表单项是够已经正确填写
*/
const { $invalid } = this.props.easyform.$invalid;
return (
<form className="" onSubmit={this.submit}>
<div>性别</div>
<FieldGroup type="radio" name="sex" required validMessage={{ required: '请选择性别' }}>
<Field label="男" value="0" ></Field>
<Field label="女" value="1" ></Field>
</FieldGroup>
<FieldGroup
type="checkbox"
name="hobbies"
required
minLength="2"
validMessage={{ required: '请选择你的爱好', minLength: '至少选择两个爱好' }}>
<Field label="篮球" value="0" ></Field>
<Field label="足球" value="1" ></Field>
<Field label="乒乓球" value="2" ></Field>
<Field label="羽毛球" value="3" ></Field>
</FieldGroup>
<button className="btn-submit" disabled={$invalid ? 'disabled' : false}>
提交
</button>
</form>
);
}
}
export default EasyForm(Form);
高阶组件包装器,你的表单组件需要使用该方法包装后返回。
/**
* EasyForm
*
* @param {Component} WrapperComponent 需要被包装的页面表单组件
* @param {Number} errorLevel 错误显示级别,默认为1
* 0: 关闭
* 1: focus时显示
* 2: dirty有改动时显示
* 3: 总是显示
* @return {HOC} 返回包装后的高阶组件
*/
class MyFormContainer extends React.Component {
render() {
return <div ></div>;
}
}
//导出时需要使用 EasyForm 包装下
export default EasyForm(MyFormContainer, 1);
返回的高阶组件,props 里会被注入两个属性:
easyform
EasyForm 的表单实例,保存了验证结果、表单项值、每个表单项的引用等params
一个快捷访问表单参数的对象(easyform 对象下也有该值)表单项高阶组件,支持 React 对 form 输入项节点的所有属性,例如defaultValue
type
onChange
等;也支持各种事件绑定。
<Field type="password" placeholder="请输入密码" onChange={this.onChange} ></Field>
<Field type="password" placeholder="请输入密码" onFocus={this.onFocus} defaultValue="12345" ></Field>
<Field type="select" placeholder="请选择性别">
<option value="">请选择</option>
<option value="0">女</option>
<option value="1">男</option>
</Field>
<Field type="radio" label="单选项描述这里传入" ></Field>
<Field type="checkbox" label="复选项描述这里传入" ></Field>
<Field type="search" ></Field>
<Field type="textarea" ></Field>
有几点需要注意:
label
传入defaultValue
传入,如果使用 value
也会导致组件成为一个受限组件(controlled components)type="select"
即可type="textarea"
即可使用 Field 生成的节点,会包含一组 easyform 验证结果 classname:
<div class="form-group">
<input type="password" placeholder="请输入密码"
class="form-control ef-valid ef-invalid ef-dirty ef-touched ef-focusing ef-error-required ef-error-minLength" />
</div>
上面即为生成的节点结构,其中 input 父级容器会包含默认的 form-group
classname,以及你通过 Field
传入的 classname。input 节点上会包含一个固定的form-control
classname,以及一组其他的值:
ef-dirty
ef-touched
ef-invalid
ef-valid
ef-focusing
ef-error-required
ef-error-pattern
ef-error-minLength
具体可以参看示例 demo
表单项组,暂时只支持 单选和复选。
<h3>性别</h3>
<FieldGroup type="radio" name="sex">
<Field label="女" value="0" ></Field>
<Field label="男" value="1" ></Field>
</FieldGroup>
<h3>爱好</h3>
<FieldGroup type="checkbox" name="hobbies">
<Field label="篮球" value="0" ></Field>
<Field label="足球" value="1" ></Field>
<Field label="乒乓球" value="2" ></Field>
<Field label="羽毛球" value="3" ></Field>
</FieldGroup>
其中 type 和 name 值必须传入。type 只能为 radio
和checkbox
。
暂时支持以下几种校验:
{RegExp | Function}
可以是正则或者一个函数,返回 bool。通过传入函数可以实现各种复杂校验需求confirm={this.refs.password}
FieldGroup
FieldGroup
异步校验
$ git clone git@github.com:qiqiboy/react-easyform.git
$ cd react-easyform/
$ npm install
$ npm start