|
@ -30,11 +30,11 @@ next: working-with-the-browser-zh-CN.html |
|
|
|
|
|
|
|
|
> 注意: |
|
|
> 注意: |
|
|
> |
|
|
> |
|
|
> 对于 `<input>` and `<textarea>`, `onChange` 替代 — 一般应该用来替代 — the DOM's 内建的 [`oninput`](https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/oninput) 事件处理。 |
|
|
> 对于 `<input>` and `<textarea>`, `onChange` 取代 — 一般应该用来替代 — DOM内建的 [`oninput`](https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/oninput) 事件处理。 |
|
|
|
|
|
|
|
|
## 受限组件 |
|
|
## 受控组件 |
|
|
|
|
|
|
|
|
设置了 `value` 的 `<input>` 是一个*受限*组件。 对于受限的 `<input>`,渲染出来的 HTML 元素始终保持 `value` 属性的值。例如: |
|
|
一个*受控*的 `<input>` 有一个 `value` prop。渲染一个受控 `<input>` 会反映 `value` prop 的值。 |
|
|
|
|
|
|
|
|
```javascript |
|
|
```javascript |
|
|
render: function() { |
|
|
render: function() { |
|
@ -42,7 +42,7 @@ next: working-with-the-browser-zh-CN.html |
|
|
} |
|
|
} |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
上面的代码将渲染出一个值为 `Hello!` 的 input 元素。用户在渲染出来的元素里输入任何值都不起作用,因为 React 已经赋值为 `Hello!`。如果想响应更新用户输入的值,就得使用 `onChange` 事件: |
|
|
用户输入在被渲染的元素里将没有作用,因为 React 已经声明值为 `Hello!`。要更新 value 来响应用户输入,你可以使用 `onChange` 事件: |
|
|
|
|
|
|
|
|
```javascript |
|
|
```javascript |
|
|
getInitialState: function() { |
|
|
getInitialState: function() { |
|
@ -52,12 +52,17 @@ next: working-with-the-browser-zh-CN.html |
|
|
this.setState({value: event.target.value}); |
|
|
this.setState({value: event.target.value}); |
|
|
}, |
|
|
}, |
|
|
render: function() { |
|
|
render: function() { |
|
|
var value = this.state.value; |
|
|
return ( |
|
|
return <input type="text" value={value} onChange={this.handleChange} />; |
|
|
<input |
|
|
|
|
|
type="text" |
|
|
|
|
|
value={this.state.value} |
|
|
|
|
|
onChange={this.handleChange} |
|
|
|
|
|
/> |
|
|
|
|
|
); |
|
|
} |
|
|
} |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
上面的代码中,React 将用户输入的值更新到 `<input>` 组件的 `value` 属性。这样实现响应或者验证用户输入的界面就很容易了。例如: |
|
|
在这个例子中,我们接受用户提供的值并更新 `<input>` 组件的 `value` prop。这个模式使实现响应或者验证用户输入的界面更容易。例如: |
|
|
|
|
|
|
|
|
```javascript |
|
|
```javascript |
|
|
handleChange: function(event) { |
|
|
handleChange: function(event) { |
|
@ -67,13 +72,15 @@ next: working-with-the-browser-zh-CN.html |
|
|
|
|
|
|
|
|
上面的代码接受用户输入,并截取前 140 个字符。 |
|
|
上面的代码接受用户输入,并截取前 140 个字符。 |
|
|
|
|
|
|
|
|
|
|
|
受控组件不维持一个自己的内部状态;它单纯的基于 props 渲染。 |
|
|
|
|
|
|
|
|
### 复选框与单选按钮的潜在问题 |
|
|
### 复选框与单选按钮的潜在问题 |
|
|
|
|
|
|
|
|
当心,在力图标准化复选框与单选按钮的变换处理中,React使用`click` 事件代替 `change` 事件。在大多数情况下它们表现的如同预期,除了在`change` handler中调用`preventDefault` 。`preventDefault` 阻止了浏览器视觉上更新输入,即使`checked`被触发。变通的方式是要么移除`preventDefault`的调用,要么把`checked` 的触发放在一个`setTimeout`里。 |
|
|
当心,在力图标准化复选框与单选按钮的变换处理中,React使用`click` 事件代替 `change` 事件。在大多数情况下它们表现的如同预期,除了在`change` handler中调用`preventDefault` 。`preventDefault` 阻止了浏览器视觉上更新输入,即使`checked`被触发。变通的方式是要么移除`preventDefault`的调用,要么把`checked` 的触发放在一个`setTimeout`里。 |
|
|
|
|
|
|
|
|
## 不受限组件 |
|
|
## 不受控组件 |
|
|
|
|
|
|
|
|
没有设置 `value`(或者设为 `null`) 的 `<input>` 组件是一个*不受限*组件。对于不受限的 `<input>` 组件,渲染出来的元素直接反应用户输入。例如: |
|
|
一个没有 `value` 属性的 `<input>` 是一个不*受控*组件: |
|
|
|
|
|
|
|
|
```javascript |
|
|
```javascript |
|
|
render: function() { |
|
|
render: function() { |
|
@ -81,7 +88,9 @@ next: working-with-the-browser-zh-CN.html |
|
|
} |
|
|
} |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
上面的代码将渲染出一个空值的输入框,用户输入将立即反应到元素上。和受限元素一样,使用 `onChange` 事件可以监听值的变化。 |
|
|
上面的代码将渲染出一个空值的输入框,用户输入将立即反应到元素上。和受控元素一样,使用 `onChange` 事件可以监听值的变化。 |
|
|
|
|
|
|
|
|
|
|
|
*不受控*组件维持它自己的内部状态。 |
|
|
|
|
|
|
|
|
### 默认值 |
|
|
### 默认值 |
|
|
|
|
|
|
|
@ -93,17 +102,17 @@ next: working-with-the-browser-zh-CN.html |
|
|
} |
|
|
} |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
这个例子会像上面的 **不受限组件** 例子一样运行。 |
|
|
这个例子会像上面的 **不受控组件** 例子一样运行。 |
|
|
|
|
|
|
|
|
同样的, `<input>` 支持 `defaultChecked` 、 `<select>` 支持 `defaultValue`. |
|
|
同样的, `<input type="checkbox">` 和 `<input type="radio">` 支持 `defaultChecked` 、 `<select>` 支持 `defaultValue`. |
|
|
|
|
|
|
|
|
> 注意: |
|
|
> 注意: |
|
|
> |
|
|
> |
|
|
> `defaultValue` 和 `defaultChecked` props 只能在内部渲染时被使用。 如果你需要在随后的渲染更新值, 你需要使用 [受限组件](#受限组件). |
|
|
> `defaultValue` 和 `defaultChecked` props 只能在内部渲染时被使用。 如果你需要在随后的渲染更新值, 你需要使用 [受控组件](#受控组件). |
|
|
|
|
|
|
|
|
## 高级主题 |
|
|
## 高级主题 |
|
|
|
|
|
|
|
|
### 为什么使用受限组件? |
|
|
### 为什么使用受控组件? |
|
|
|
|
|
|
|
|
在 React 中使用诸如 `<input>` 的表单组件时,遇到了一个在传统 HTML 中没有的挑战。比如下面的代码: |
|
|
在 React 中使用诸如 `<input>` 的表单组件时,遇到了一个在传统 HTML 中没有的挑战。比如下面的代码: |
|
|
|
|
|
|
|
@ -111,9 +120,9 @@ next: working-with-the-browser-zh-CN.html |
|
|
<input type="text" name="title" value="Untitled" /> |
|
|
<input type="text" name="title" value="Untitled" /> |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
在 HTML 中将渲染 *初始值* 为 `Untitled` 的输入框。用户改变输入框的值时,节点的 `value` 属性( *property*)将随之变化,但是 `node.getAttribute('value')` 还是会返回初始设置的值 `Untitled`. |
|
|
它渲染一个*初始值*为 `Untitled` 的输入框。当用户改变输入框的值时,节点的 `value` 属性( *property*)将随之变化,但是 `node.getAttribute('value')` 还是会返回初始设置的值 `Untitled`. |
|
|
|
|
|
|
|
|
与 HTML 不同,React 组件必须在任何时间点描绘视图的状态,而不仅仅是在初始化时。比如在 React 中: |
|
|
与 HTML 不同,React 组件必须在任何时间点表现视图的状态,而不仅仅是在初始化时。比如在 React 中: |
|
|
|
|
|
|
|
|
```javascript |
|
|
```javascript |
|
|
render: function() { |
|
|
render: function() { |
|
@ -121,7 +130,7 @@ next: working-with-the-browser-zh-CN.html |
|
|
} |
|
|
} |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
该方法在任何时间点渲染组件以后,输入框的值就应该 *始终* 为 `Untitled`。 |
|
|
既然这个方法描述了在任意时间点上的视图,那么文本输入框的值就应该*始终*为 `Untitled`。 |
|
|
|
|
|
|
|
|
### 为什么 `<textarea>` 使用 `value` 属性? |
|
|
### 为什么 `<textarea>` 使用 `value` 属性? |
|
|
|
|
|
|
|
@ -132,7 +141,7 @@ next: working-with-the-browser-zh-CN.html |
|
|
<textarea name="description">This is the description.</textarea> |
|
|
<textarea name="description">This is the description.</textarea> |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
对 HTML 而言,让开发者设置多行的值很容易。但是,React 是 JavaScript,没有字符限制,可以使用 `\n` 实现换行。简言之,React 已经有 `value`、`defaultValue` 属性,`</textarea>` 组件的子节点扮演什么角色就有点模棱两可了。基于此, 设置 `<textarea>` 值时不应该使用子节点: |
|
|
对 HTML 而言,让开发者设置多行的值很容易。但是,React 是 JavaScript,没有字符串限制,可以使用 `\n` 实现换行。简言之,React 已经有 `value`、`defaultValue` 属性,`</textarea>` 组件的子节点扮演什么角色就有点模棱两可了。基于此, 设置 `<textarea>` 值时不应该使用子节点: |
|
|
|
|
|
|
|
|
```javascript |
|
|
```javascript |
|
|
<textarea name="description" value="This is a description." /> |
|
|
<textarea name="description" value="This is a description." /> |
|
@ -152,7 +161,7 @@ HTML 中 `<select>` 通常使用 `<option>` 的 `selected` 属性设置选中状 |
|
|
</select> |
|
|
</select> |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
如果是不受限组件,则使用 `defaultValue`。 |
|
|
如果是不受控组件,则使用 `defaultValue`。 |
|
|
|
|
|
|
|
|
> 注意: |
|
|
> 注意: |
|
|
> |
|
|
> |
|
|