表单控件:

input

文档在介绍控件之前,先提到了react组件自身的一个特点:状态由state掌控,改变组件状态只能用setState方法。

而在html的表单里,input、radio、checkbox、select的值都是随用户输入改变的。

要创建一个React的表单控件,也就是用React的方式创建表单组件:

<label>
Name:
<input type="text" value={this.state.value} onChange={this.handleChange} />
</label>

在input控件中,value值就是一个状态state.value。当用户输入完成后,通过onChange事件调用setState改变state.value的值,从而让state.value与用户输入一致。此时,input不再是一个单纯的表单元素,而是一个React组件,可以有各种用户自定义行为。这和vue的v-model倒是很一致。一个组件就是一个实例,状态变量属于实例的(私有)属性,并能单向/双向绑定。

textarea:

在html中,textarea的初始值由其文本元素定义。

在React中,用其value特性来表示。具体操作和input一样:

  <textarea value={this.state.value} onChange={this.handleChange} />

select:

 <select>
<option value="grapefruit">Grapefruit</option>
<option value="lime">Lime</option>
<option selected value="coconut">Coconut</option>
<option value="mango">Mango</option>
</select>

在html中,select创建下拉菜单,在option中庸selected特性预选一个option。

在React中,不适用selected特性,而是直接用value预定义某个选项的值。这使得对select的操作专注在value特性。

   //...
constructor(props) {
super(props);
this.state = {value: 'coconut'}; this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
//...
<select value={this.state.value} onChange={this.handleChange}>
<option value="grapefruit">Grapefruit</option>
<option value="lime">Lime</option>
<option value="coconut">Coconut</option>
<option value="mango">Mango</option>
</select>

因此,对于input、textarea和select,我们只需要操作value即可。

处理Multiple Inputs:

文档给了一个针对多个表单控件的例程,我们可以通过判断控件的的name和type特性来处理:

   handleInputChange(event) {
const target = event.target;
const value = target.type === 'checkbox' ? target.checked : target.value;
const name = target.name; this.setState({
[name]: value
});
}

此时,表单的状态就是表单的名值对,经过URI编码后可以post给后台。

另一种替代方案:

  文档提到,如果我们嫌表单控件麻烦,可以用另一种形式的表单组件--Uncontrolled Components:

意思是我们不必特意给form中的表单元素写处理程序,也不需要创建state变量。我们只需要写一个针对整个表单的处理程序,在用户submit的时候调用即可。其中,表单元素的value的输入用一个ref函数捕获:

   render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
Name:
<input type="text" ref={(input) => this.input = input} />
</label>
<input type="submit" value="Submit" />
</form>
);

另外,Uncontrolled Components形式的表单中,为了给表单元素设置初始值,有一个defaultValue特性,在表单渲染的时候显示初始值。

         <input
defaultValue="Bob"
type="text"
ref={(input) => this.input = input} />

React:form的更多相关文章

  1. 小而美的 React Form 组件

    背景 之间在一篇介绍过 Table 组件< React 实现一个漂亮的 Table > 的文章中讲到过,在企业级后台产品中,用的最多且复杂的组件主要包括 Table.Form.Chart, ...

  2. [React] Simplify and Convert a Traditional React Form to Formik

    Forms in React are not easy. T render() { return ( <React.Fragment> <h2>Regular Maintena ...

  3. React.createClass和extends Component的区别

    React.createClass和extends Component的区别主要在于: 语法区别 propType 和 getDefaultProps 状态的区别 this区别 Mixins 语法区别 ...

  4. react引用antd的form表单

    引用form是第三方插件ant插件,官网网址:https://ant.design/.用到的antd的版本是@2.0.1.form(https://ant.design/components/form ...

  5. 同时使用 Ant Design of React 中 Mention 和 Form

    使用场景,在一个列表中,点击每一行会弹出一个表单,通过修改表单数据并提交来修改这一行的数据,其中某个数据的填写需要通过Mention实现动态提示及自动补全的功能. 具体效果为: 遇到的问题: 1.希望 ...

  6. react antd form多组表单数据处理

    import React from 'react'; import {Form, InputNumber, Input, DatePicker, Button, Select, Icon} from ...

  7. react this.props.form异步执行问题

    最近在做一个选择器联动时,碰到this.props.form的异步执行问题,导致选择器一直没有办法联动 如图,选择公司名称后,应该同步刷新门店选择默认值, 但同时又要清空门店选择的上一次记录 就用到了 ...

  8. 【共享单车】—— React后台管理系统开发手记:AntD Form基础组件

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  9. [React] Persist Form Data in React and Formik with formik-persist

    It can be incredibly frustrating to spend a few minutes filling out a form only to accidentally lose ...

随机推荐

  1. vector做形参时的三种传参方式

    vector在做形参的时候传参的方式和普通的变量是一样的,要么传值.要么传引用.要么传指针. 现在分别定义三个以vector为形参的函数: (1) fun1(vector <int> v) ...

  2. Linux 高 wio 分析

    High IO wait Table of Contents 1. 现象 2. 分析 2.1. iotop或者pidstat 2.1.1. iotop 2.1.2. pidstat 2.2. 脚本 2 ...

  3. Scrapy爬虫框架(1)--安装配置与常用命令

    安装与配置 Scrapy有几个安装依赖,一般来说可以直接pip install scrapy,这个过程会自动下载安装其他几个依赖. 上述安装方法不成功,则需要手动安装依赖包 步骤 安装 lxmlpip ...

  4. python学习笔记(二)---for循环与操作列表

    内容概要 for循环 range(start,end,step)函数 生成随机数列表 list()函数 将range()的结果整合到某个列表 列表的操作 切片(start: end :step) 元组 ...

  5. JQ获取select上的option的data-start和data-id

    来源:https://zhidao.baidu.com/question/692142321436883524.html 静态的写法: 用jq的attr()函数,如: HTML: <select ...

  6. 超详细步骤---Linux下的最新Git版本安装

    原文地址:https://blog.csdn.net/u010887744/article/details/53957613 [标注大头] 1.查看当前git版本:git --version 查看最新 ...

  7. python学习08排序算法举例

    '''''''''排序算法:前提是所有数按照从小到大的顺序排列.1.冒泡算法将第一数与第二个数比较大小,如果第一个数比第二个数大,则沉底(交换位置,使大数在小数后面,这个过程类似于大泡沉底的过程) ' ...

  8. [Qt] 去掉QMessageBox标题栏上的图标

    msgBox.setWindowFlags(Qt::Drawer);

  9. Spring Cloud sleuth with zipkin over RabbitMQ教程

    文章目录 Spring Cloud sleuth with zipkin over RabbitMQ demo zipkin server的搭建(基于mysql和rabbitMQ) 客户端环境的依赖 ...

  10. Week-1 linux命令行重点整理

    ①仅对当前用户: ~/.bashrc ②对所有用户有效: /etc/bashrc screen命令:创建新screen会话screen –S [SESSION]加入screen会话screen –x ...