And Design:拓荒笔记——Form表单
And Design:拓荒笔记——Form表单
Form.create(options)
Form.create()可以对包含Form表单的组件进行改造升级,会返回一个新的react组件。
经 Form.create() 包装过的组件会自带 this.props.form 属性,这个属性提供了很多API来实现对表单的操作:

代码如下:
class CustomizedForm extends React.Component {}
CustomizedForm = Form.create({})(CustomizedForm);
获取Form引用
经过 Form.create 之后如果要拿到表单的引用,可以使用 wrappedComponentRef。
class CustomizedForm extends React.Component {
...
}
// use wrappedComponentRef
const EnhancedForm = Form.create()(CustomizedForm);
<EnhancedForm wrappedComponentRef={(form) => this.form = form} />
this.form // => The instance of CustomizedForm
this.props.form.getFieldDecorator(id, options)
this.props.form.getFieldDecorator()可以对控件进行改造升级,会返回一个新的控件。他有如下的可选参数:

经过 getFieldDecorator 包装的控件,表单控件会自动添加 value(或 valuePropName 指定的其他属性) onChange(或 trigger 指定的其他属性),数据同步将被 Form 接管,这会导致以下结果:
你不再需要也不应该用
onChange来做同步,但还是可以继续监听onChange等事件。你不能用控件的
valuedefaultValue等属性来设置表单域的值,默认值可以用getFieldDecorator里的initialValue。你不应该用
setState,可以使用this.props.form.setFieldsValue来动态改变表单值。
Form.Item
Form.Item表示一个表单项, 建议其中放一个被 getFieldDecorator 装饰过的 child,如下:
<Form.Item label="标题" required={true} {...formItemLayout}>
{getFieldDecorator('url_title', {
rules: [{required: true, message: '请输入标题!'}],
initialValue:'12345'})(<Input/>)}
</Form.Item>
其中一些重要的属性,如下:

即,我们可以手动设置表单项的校验状态

数据校验
我们使用this.props.form.getFieldDecorator包裹控件时,可以设置该控件的校验规则,如:

一个简单的必须项检验规则如下:
<Form.Item label="标题" required={true} {...formItemLayout}>
{getFieldDecorator('url_title', {
rules: [{required: true, message: '请输入标题!'}]
})(<Input/>)}
</Form.Item>
表单提交
在<Form/>内添加提交按钮
我们在表单内添加了类型为submit的提交按钮,并且设置了Form的提交处理函数,即执行this.handleSubmit。
<Form onSubmit={this.handleSubmit}>
<Form.Item label="标题" required={true}>
{getFieldDecorator('title', {
rules: [{required: true, message: '请输入标题!'}],
})(
<Input prefix={<Icon type="book" style={{color: 'rgba(0,0,0,.25)'}}/>} placeholder="..."/>
)}
</Form.Item>
<Form.Item>
<Button type={"primary"} htmlType={"submit"}>提交</Button>
</Form.Item>
</Form>
当用户点击提交时,我们首先需要判断字段值是否满足其校验规则,若没有错误,我们可以执行我们自定义的提交。
handleSubmit = (e) => {
console.log(e)
e.preventDefault();
this.props.form.validateFields((err, values) => {
if (!err) {
console.log('Received values of form: ', values);
this.props.submitData(values);
}
});
}
其中,表单校验的函数说明如下:

获取Form引用后提交
经过 Form.create 之后如果要拿到表单的引用,可以使用 rc-form 提供的 wrappedComponentRef,详细内容可以查看这里。
class CustomizedForm extends React.Component { ... }
// use wrappedComponentRef
const EnhancedForm = Form.create()(CustomizedForm);
<EnhancedForm wrappedComponentRef={(form) => this.form = form} />
this.form // => The instance of CustomizedForm
获取到引用后,我们可以接着实现数据验证、提交等操作。
this.form.validateFields((err, values) => {
if (!err) {
console.log('Received values of form: ', values);
this.submitData(values);
}
});
}
表单数据初始化
设置默认值
在使用getFieldDecorator包装的组件的时候,可以添加初始化参数设置默认值。

代码如下:
<Form.Item label="标题" required={true} {...formItemLayout}>
{getFieldDecorator('url_title', {
rules: [{required: true, message: '请输入标题!'}],
initialValue:'12345'
})(<Input/>)}
</Form.Item>
与Redux结合
在 Form.create 时,该函数可选一些参数,如下:

mapPropsToFields, 可以将Props属性的内容直接映射到表单项上。
我们知道connect()函数负责从UI组件生成容器组件,其mapStateToProps函数负可以寄将state转换为props交给UI组件,来供容器组件进行UI渲染。所以我们做了两步操作来实现:

注意:
mapPropsToFields里面返回的表单域数据必须使用Form.createFormField包装。
代码如下,表单项须使用getFieldDecorator进行包装。
const WrapperAddMarkFrom = Form.create({
mapPropsToFields(props) {
console.log(props)
return {
url_title: Form.createFormField({
value: props.formData.XXX,
}),
url_content: Form.createFormField({
value: props.formData.YYY
})
};
})(ControlPanel);
function mapDispatchToProps(dispatch) {...}
function mapStateToProps(state) {
return{
formData:state.data
}
}
const ControlPanelApp = connect(mapStateToProps,mapDispatchToProps)(WrapperAddMarkFrom)
export default ControlPanelApp
And Design:拓荒笔记——Form表单的更多相关文章
- angular2 学习笔记 ( Form 表单 )
refer : https://angular.cn/docs/ts/latest/guide/forms.html https://angular.cn/docs/ts/latest/cookboo ...
- [原创]java WEB学习笔记62:Struts2学习之路--表单标签:form,表单标签的属性,textfield, password, hidden,submit ,textarea ,checkbox ,list, listKey 和 listValue 属性,select ,optiongroup ,checkboxlist
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Yii笔记:打印sql、Form表单、时间插件、Mysql的 FIND_IN_SET函数使用、是否是post/ajax请求
语句部分: yii1版本打印最后一条执行的SQL: $this->getDbConnection()->createCommand()->select()->from()-&g ...
- HTML学习笔记 域元素(form表单、textarea文本域、fieldset域集合、input使用) 案例 第四节 (原创)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Django学习笔记(6)——Form表单
知识储备:HTML表单form学习 表单,在前端页面中属于最常见的一个东西了.基本上网站信息的提交都用到了表单,所以下面来学习Django中优雅的表单系统:Form 表单的主要作用是在网页上提供一个图 ...
- 学习笔记之form表单
form表单提交的数据 是字典类型 这样 方便在create时候 直接解压
- Bootstrap学习总结笔记(24)-- 基于BootstrapValidator的Form表单验证
Form表单进行数据验证是十分必要的,我们可以自己写JS脚本或者使用JQuery Validate 插件来实现.对于Bootstrap而言,利用BootstrapValidator来做Form表单验证 ...
- Django学习笔记之Django Form表单详解
知识预览 构建一个表单 在Django 中构建一个表单 Django Form 类详解 使用表单模板 回到顶部 构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的 ...
- 前端笔记:React的form表单全部置空或者某个操作框置空的做法
1.全部置空的做法,一般在弹出框关闭后,需要重置该form所有表单: this.props.form.resetFields(); 2.针对某个操作框置空的做法 例如,form表单里有一个部门和一个张 ...
随机推荐
- 超全面的JavaWeb笔记day22<文件上传>
文件上传概述 1 文件上传的作用 例如网络硬盘!就是用来上传下载文件的. 在智联招聘上填写一个完整的简历还需要上传照片呢. 2 文件上传对页面的要求 上传文件的要求比较多,需要记一下: 1. 必须使用 ...
- YARN的设计
YARN:下一代 Hadoop 计算平台 我们现在稍微改变一下用辞.以下名称的改动有助于更好地了解 YARN 的设计: ResourceManager 代替集群管理器 ApplicationMaste ...
- list中的比较
一说到list的的确不知道写些什么.....我觉得别人总结的比我写的还要好很多. 我擅长记录自己的误区. |--List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3 ...
- saltstack远程执行命令.md
saltstack 支持在master上向client 远程执行命令,并显示命令执行的结果 命令格式: salt '<操作目标>' <方法> [参数] 示例 示例1 ping检 ...
- JS常用函数与方法
//当页面关闭时触发 window.onbeforeunload = function() { alert('关闭了吧'); } //关闭窗口(弹出式窗口) parent.window.close() ...
- poj_2553 强连通分支&出度为0的点
题目大意 N个点的有向图中,定义“好点”为: 从该点v出发可以到达的所有点u,均有一条路径使得u可达v. 求出图中所有的“好点”,并按照顺序从小到大输出出来. 题目分析 图存在多个强连通分支,强连通分 ...
- c++11——基于范围的for循环
c++11中有基于范围的for循环,基于范围的for循环可以不再关心迭代器的概念,只需要关系容器中的元素类型即可,同时也不必显式的给出容器的开头和结尾. int arr[] = {1, 2, 3, 4 ...
- MyBatis——Mapper XML 文件
Mapper XML 文件 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会 ...
- Cisco设备开启telnet登录
思科设备怎么开启telnet登录 configuration line vty 0 4SW1(config-line)#transp input telne
- hihoCoder_1449_后缀自动机三·重复旋律6
#1449 : 后缀自动机三·重复旋律6 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...