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 接管,这会导致以下结果:

  1. 你不再需要也不应该用 onChange 来做同步,但还是可以继续监听 onChange 等事件。

  2. 你不能用控件的 value defaultValue 等属性来设置表单域的值,默认值可以用 getFieldDecorator 里的 initialValue。

  3. 你不应该用 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表单的更多相关文章

  1. angular2 学习笔记 ( Form 表单 )

    refer : https://angular.cn/docs/ts/latest/guide/forms.html https://angular.cn/docs/ts/latest/cookboo ...

  2. [原创]java WEB学习笔记62:Struts2学习之路--表单标签:form,表单标签的属性,textfield, password, hidden,submit ,textarea ,checkbox ,list, listKey 和 listValue 属性,select ,optiongroup ,checkboxlist

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. Yii笔记:打印sql、Form表单、时间插件、Mysql的 FIND_IN_SET函数使用、是否是post/ajax请求

    语句部分: yii1版本打印最后一条执行的SQL: $this->getDbConnection()->createCommand()->select()->from()-&g ...

  4. HTML学习笔记 域元素(form表单、textarea文本域、fieldset域集合、input使用) 案例 第四节 (原创)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Django学习笔记(6)——Form表单

    知识储备:HTML表单form学习 表单,在前端页面中属于最常见的一个东西了.基本上网站信息的提交都用到了表单,所以下面来学习Django中优雅的表单系统:Form 表单的主要作用是在网页上提供一个图 ...

  6. 学习笔记之form表单

    form表单提交的数据 是字典类型 这样 方便在create时候 直接解压

  7. Bootstrap学习总结笔记(24)-- 基于BootstrapValidator的Form表单验证

    Form表单进行数据验证是十分必要的,我们可以自己写JS脚本或者使用JQuery Validate 插件来实现.对于Bootstrap而言,利用BootstrapValidator来做Form表单验证 ...

  8. Django学习笔记之Django Form表单详解

    知识预览 构建一个表单 在Django 中构建一个表单 Django Form 类详解 使用表单模板 回到顶部 构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的 ...

  9. 前端笔记:React的form表单全部置空或者某个操作框置空的做法

    1.全部置空的做法,一般在弹出框关闭后,需要重置该form所有表单: this.props.form.resetFields(); 2.针对某个操作框置空的做法 例如,form表单里有一个部门和一个张 ...

随机推荐

  1. Java精选笔记_面向对象(慨念、类和对象)

    面向对象概念 在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象. 相对于面向过程而言.是一种思想,强调的是功能的对象. 面向对象的本质:以类的方式组织代码, ...

  2. Java 基本语法----数组

    数组 数组概述 数组是多个相同类型数据的组合,实现对这些数据的统一管理. 数组属引用类型,数组型数据是对象(Object),数组中的每个元素相当于该对象的成员变量. 数组中的元素可以是任何数据类型,包 ...

  3. window 后台执行 redis(隐藏窗口)

    方法是在知乎上看的,链接:https://www.zhihu.com/question/22771030 实现方法是利用一个vbe脚本去运行一个bat脚本,在bat脚本里启动exe软件 PS:要想启动 ...

  4. ARM、MCU、DSP、FPGA、SOC各是什么?区别是什么?(转)

    ARM ARM处理器是Acorn计算机有限公司面向低预算市场设计的第一款RISC微处理器.更早称作Acorn RISC Machine.ARM处理器本身是32位设计,但也配备16位指令集,一般来讲比等 ...

  5. 打造不死的asp木马

    作者:黑色记忆本文已发表于<黑客X档案>杂志第十期 版权归<黑客X档案>所有 转载请注明版权 想不到,前几天我才发现,我千辛万苦收集的asp木马,居然没有几个不被Kill的.常 ...

  6. 2.5 CMMI2级——配置管理(Configuration Management)

    我们先需要回答,什么是 配置管理? 这个问题好难回答,我们可以找到很多解释,但真正理解配置管理的人可能不多. 配置管理的概念非常多,我们可不愿意做理论家,我们是非常务实的,我们先看看,如果没有有效的配 ...

  7. java FileUtil(文件操作类)

    package tools; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; i ...

  8. 转载-解决使用httpClient 4.3.x登陆 https时的证书报错问题

    今天在使用httpClient4.3.6模拟登陆https网站的时候出现了证书报错的问题,这是在开源中国社区里找到的可行的答案(原文链接:http://www.oschina.net/question ...

  9. C#IIS网站应用程序池启动回收停止 .

    //添加应用程序池空间引用using System.DirectoryServices;using System.Text; using System.Text.RegularExpressions; ...

  10. Unity3D笔记三 物理引擎

    一.物理引擎 1.物理引擎就是模拟真实世界中物体碰撞.跌落等反应,通过Ballance.愤怒的小鸟来理解什么是物理引擎.Unity的物理引擎使用的是NviDIA的PhysX.2.选中一个游戏对象,主菜 ...