React入门指南
快速入门
快速开始
教程
深入理解 React
为什么使用 React?
数据呈现
深入理解 JSX
JSX的延展属性
JSX 的陷阱
富交互性的动态用户界面
复合组件
可复用组件
传递 Props
表单组件
浏览器中的工作原理
关于Refs的更多内容
工具集成(Tooling Integration)
插件
动画
双向绑定辅助工具
类名操作
测试工具集
克隆组件
不可变数据的辅助工具(Immutability Helpers)
PureRenderMixin
性能分析工具
本书使用 GeChiUI.com 发布
表单组件
表单组件
最后更新于:2022-04-01 20:47:51
诸如 `
`、`
`、`
` 这样的表单组件不同于其他组件,因为他们可以通过用户交互发生变化。这些组件提供的界面使响应用户交互的表单数据处理更加容易。 关于 `
` 事件详情请查看 [表单事件](http://reactjs.cn/react/docs/events.html#form-events)。 ## 交互属性 表单组件支持几个受用户交互影响的属性: * `value`,用于 `
`、`
` 组件。 * `checked`,用于类型为 `checkbox` 或者 `radio` 的 `
` 组件。 * `selected`,用于 `
` 组件。 在 HTML 中,`
` 的值通过子节点设置;在 React 中则应该使用 `value` 代替。 表单组件可以通过 `onChange` 回调函数来监听组件变化。当用户做出以下交互时,`onChange` 执行并通过浏览器做出响应: * `
` 或 `
` 的 value 发生变化时。 * `
` 的 checked 状态改变时。 * `
` 的 selected 状态改变时。 和所有 DOM 事件一样,所有的 HTML 原生组件都支持 `onChange` 属性,而且可以用来监听冒泡的 `change` 事件。 ## 受限组件 设置了 `value` 的 `
` 是一个_受限_组件。 对于受限的 `
`,渲染出来的 HTML 元素始终保持 `value` 属性的值。例如: ~~~ render: function() { return
; } ~~~ 上面的代码将渲染出一个值为 `Hello!` 的 input 元素。用户在渲染出来的元素里输入任何值都不起作用,因为 React 已经赋值为 `Hello!`。如果想响应更新用户输入的值,就得使用`onChange` 事件: ~~~ getInitialState: function() { return {value: 'Hello!'}; }, handleChange: function(event) { this.setState({value: event.target.value}); }, render: function() { var value = this.state.value; return
; } ~~~ 上面的代码中,React 将用户输入的值更新到 `
` 组件的 `value` 属性。这样实现响应或者验证用户输入的界面就很容易了。例如: ~~~ handleChange: function(event) { this.setState({value: event.target.value.substr(0, 140)}); } ~~~ 上面的代码接受用户输入,并截取前 140 个字符。 ## 不受限组件 没有设置 `value`(或者设为 `null`) 的 `
` 组件是一个_不受限_组件。对于不受限的`
` 组件,渲染出来的元素直接反应用户输入。例如: ~~~ render: function() { return
; } ~~~ 上面的代码将渲染出一个空值的输入框,用户输入将立即反应到元素上。和受限元素一样,使用 `onChange` 事件可以监听值的变化。 如果想给组件设置一个非空的初始值,可以使用 `defaultValue` 属性。例如: ~~~ render: function() { return
; } ~~~ 上面的代码渲染出来的元素和**受限组件**一样有一个初始值,但这个值用户可以改变并会反应到界面上。 同样地, 类型为 `radio`、`checkbox` 的`
` 支持 `defaultChecked` 属性, `
`支持 `defaultValue` 属性。 ~~~ render: function() { return (
Option 1
Option 2
Apple
Banana
Cranberry
); } ~~~ ## 高级主题 ### 为什么使用受限组件? 在 React 中使用诸如 `
` 的表单组件时,遇到了一个在传统 HTML 中没有的挑战。 比如下面的代码: ~~~
~~~ 在 HTML 中将渲染初始值为 `Untitled` 的输入框。用户改变输入框的值时,节点的 `value`属性(_property_)将随之变化,但是 `node.getAttribute('value')` 还是会返回初始设置的值 `Untitled`. 与 HTML 不同,React 组件必须在任何时间点描绘视图的状态,而不仅仅是在初始化时。比如在 React 中: ~~~ render: function() { return
; } ~~~ 该方法在任何时间点渲染组件以后,输入框的值就应该_始终_为 `Untitled`。 ### 为什么 `
` 使用 `value` 属性? 在 HTML 中, `
` 的值通常使用子节点设置: ~~~
This is the description.
~~~ 对 HTML 而言,让开发者设置多行的值很容易。但是,React 是 JavaScript,没有字符限制,可以使用 `\n` 实现换行。简言之,React 已经有 `value`、`defaultValue` 属性,`
` 组件的子节点扮演什么角色就有点模棱两可了。基于此, 设置`
` 值时不应该使用子节点: ~~~
~~~ 如果_非要_*使用子节点,效果和使用 `defaultValue` 一样。 ### 为什么 `
` 使用 `value` 属性 HTML 中 `
` 通常使用 `
` 的 `selected` 属性设置选中状态;React 为了更方面的控制组件,采用以下方式代替: ~~~
Apple
Banana
Cranberry
~~~ 如果是不受限组件,则使用 `defaultValue`。 > 注意: > > 给 `value` 属性传递一个数组,可以选中多个选项:`
`。
';