Skip to content

Commit 3592990

Browse files
committed
Merge pull request #2734 from Minwe/master
add Forms and Event System docs Chinese translation
1 parent 69a7e39 commit 3592990

2 files changed

Lines changed: 362 additions & 0 deletions

File tree

docs/docs/07-forms.zh-CN.md

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
---
2+
id: forms-zh-CN
3+
title: 表单组件
4+
permalink: forms-zh-CN.html
5+
prev: transferring-props-zh-CN.html
6+
next: working-with-the-browser-zh-CN.html
7+
---
8+
9+
诸如 `<input>``<textarea>``<option>` 这样的表单组件不同于其他组件,因为他们可以通过用户交互发生变化。这些组件提供的界面使响应用户交互的表单数据处理更加容易。
10+
11+
关于 `<form>` 事件详情请查看 [表单事件](/react/docs/events.html#form-events)
12+
13+
## 交互属性
14+
15+
表单组件支持几个受用户交互影响的属性:
16+
17+
* `value`,用于 `<input>``<textarea>` 组件。
18+
* `checked`,用于类型为 `checkbox` 或者 `radio``<input>` 组件。
19+
* `selected`,用于 `<option>` 组件。
20+
21+
在 HTML 中,`<textarea>` 的值通过子节点设置;在 React 中则应该使用 `value` 代替。
22+
23+
表单组件可以通过 `onChange` 回调函数来监听组件变化。当用户做出以下交互时,`onChange` 执行并通过浏览器做出响应:
24+
25+
* `<input>``<textarea>``value` 发生变化时。
26+
* `<input>``checked` 状态改变时。
27+
* `<option>``selected` 状态改变时。
28+
29+
和所有 DOM 事件一样,所有的 HTML 原生组件都支持 `onChange` 属性,而且可以用来监听冒泡的 `change` 事件。
30+
31+
32+
## 受限组件
33+
34+
设置了 `value``<input>` 是一个*受限*组件。 对于受限的 `<input>`,渲染出来的 HTML 元素始终保持 `value` 属性的值。例如:
35+
36+
```javascript
37+
render: function() {
38+
return <input type="text" value="Hello!" />;
39+
}
40+
```
41+
42+
上面的代码将渲染出一个值为 `Hello!` 的 input 元素。用户在渲染出来的元素里输入任何值都不起作用,因为 React 已经赋值为 `Hello!`。如果想响应更新用户输入的值,就得使用 `onChange` 事件:
43+
44+
```javascript
45+
getInitialState: function() {
46+
return {value: 'Hello!'};
47+
},
48+
handleChange: function(event) {
49+
this.setState({value: event.target.value});
50+
},
51+
render: function() {
52+
var value = this.state.value;
53+
return <input type="text" value={value} onChange={this.handleChange} />;
54+
}
55+
```
56+
57+
上面的代码中,React 将用户输入的值更新到 `<input>` 组件的 `value` 属性。这样实现响应或者验证用户输入的界面就很容易了。例如:
58+
59+
```javascript
60+
handleChange: function(event) {
61+
this.setState({value: event.target.value.substr(0, 140)});
62+
}
63+
```
64+
65+
上面的代码接受用户输入,并截取前 140 个字符。
66+
67+
68+
## 不受限组件
69+
70+
没有设置 `value`(或者设为 `null`) 的 `<input>` 组件是一个*不受限*组件。对于不受限的 `<input>` 组件,渲染出来的元素直接反应用户输入。例如:
71+
72+
```javascript
73+
render: function() {
74+
return <input type="text" />;
75+
}
76+
```
77+
78+
上面的代码将渲染出一个空值的输入框,用户输入将立即反应到元素上。和受限元素一样,使用 `onChange` 事件可以监听值的变化。
79+
80+
如果想给组件设置一个非空的初始值,可以使用 `defaultValue` 属性。例如:
81+
82+
```javascript
83+
render: function() {
84+
return <input type="text" defaultValue="Hello!" />;
85+
}
86+
```
87+
88+
上面的代码渲染出来的元素和**受限组件**一样有一个初始值,但这个值用户可以改变并会反应到界面上。
89+
90+
同样地, 类型为 `radio``checkbox``<input>` 支持 `defaultChecked` 属性, `<select>` 支持 `defaultValue` 属性。
91+
92+
```javascript
93+
render: function() {
94+
return (
95+
<div>
96+
<input type="radio" name="opt" defaultChecked /> Option 1
97+
<input type="radio" name="opt" /> Option 2
98+
<select defaultValue="C">
99+
<option value="A">Apple</option>
100+
<option value="B">Banana</option>
101+
<option value="C">Cranberry</option>
102+
</select>
103+
</div>
104+
);
105+
}
106+
```
107+
108+
109+
## 高级主题
110+
111+
### 为什么使用受限组件?
112+
113+
在 React 中使用诸如 `<input>` 的表单组件时,遇到了一个在传统 HTML 中没有的挑战。
114+
115+
比如下面的代码:
116+
117+
```html
118+
<input type="text" name="title" value="Untitled" />
119+
```
120+
121+
在 HTML 中将渲染初始值为 `Untitled` 的输入框。用户改变输入框的值时,节点的 `value` 属性(*property*)将随之变化,但是 `node.getAttribute('value')` 还是会返回初始设置的值 `Untitled`.
122+
123+
与 HTML 不同,React 组件必须在任何时间点描绘视图的状态,而不仅仅是在初始化时。比如在 React 中:
124+
125+
```javascript
126+
render: function() {
127+
return <input type="text" name="title" value="Untitled" />;
128+
}
129+
```
130+
131+
该方法在任何时间点渲染组件以后,输入框的值就应该*始终*`Untitled`
132+
133+
134+
### 为什么 `<textarea>` 使用 `value` 属性?
135+
136+
在 HTML 中, `<textarea>` 的值通常使用子节点设置:
137+
138+
```html
139+
<!-- 反例:在 React 中不要这样使用! -->
140+
<textarea name="description">This is the description.</textarea>
141+
```
142+
143+
对 HTML 而言,让开发者设置多行的值很容易。但是,React 是 JavaScript,没有字符限制,可以使用 `\n` 实现换行。简言之,React 已经有 `value``defaultValue` 属性,`</textarea>` 组件的子节点扮演什么角色就有点模棱两可了。基于此, 设置 `<textarea>` 值时不应该使用子节点:
144+
145+
```javascript
146+
<textarea name="description" value="This is a description." />
147+
```
148+
149+
如果*非要**使用子节点,效果和使用 `defaultValue` 一样。
150+
151+
152+
### 为什么 `<select>` 使用 `value` 属性
153+
154+
HTML 中 `<select>` 通常使用 `<option>``selected` 属性设置选中状态;React 为了更方面的控制组件,采用以下方式代替:
155+
156+
```javascript
157+
<select value="B">
158+
<option value="A">Apple</option>
159+
<option value="B">Banana</option>
160+
<option value="C">Cranberry</option>
161+
</select>
162+
```
163+
164+
如果是不受限组件,则使用 `defaultValue`
165+
166+
> 注意:
167+
>
168+
> `value` 属性传递一个数组,可以选中多个选项:`<select multiple={true} value={['B', 'C']}>`

docs/docs/ref-05-events.zh-CN.md

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
---
2+
id: events-zh-CN
3+
title: 事件系统
4+
permalink: events-zh-CN.html
5+
prev: tags-and-attributes-zh-CN.html
6+
next: dom-differences-zh-CN.html
7+
---
8+
9+
## 合成事件
10+
11+
事件处理程序通过 `合成事件``SyntheticEvent`)的实例传递,`SyntheticEvent` 是浏览器原生事件跨浏览器的封装。`SyntheticEvent` 和浏览器原生事件一样有 `stopPropagation()``preventDefault()` 接口,而且这些接口夸浏览器兼容。
12+
13+
如果出于某些原因想使用浏览器原生事件,可以使用 `nativeEvent` 属性获取。每个和成事件(`SyntheticEvent`)对象都有以下属性:
14+
15+
```javascript
16+
boolean bubbles
17+
boolean cancelable
18+
DOMEventTarget currentTarget
19+
boolean defaultPrevented
20+
Number eventPhase
21+
boolean isTrusted
22+
DOMEvent nativeEvent
23+
void preventDefault()
24+
void stopPropagation()
25+
DOMEventTarget target
26+
Date timeStamp
27+
String type
28+
```
29+
30+
> 注意:
31+
>
32+
> React v0.12 中,事件处理程序返回 `false` 不再停止事件传播,取而代之,应该根据需要手动触发 `e.stopPropagation()``e.preventDefault()`
33+
34+
35+
## 支持的事件
36+
37+
React 将事件统一化,使事件在不同浏览器上有一致的属性。
38+
39+
下面的事件处理程序在事件冒泡阶段被触发。如果要注册事件捕获处理程序,应该使用 `Capture` 事件,例如使用 `onClickCapture` 处理点击事件的捕获阶段,而不是 `onClick`
40+
41+
42+
### 剪贴板事件
43+
44+
事件名称:
45+
46+
```
47+
onCopy onCut onPaste
48+
```
49+
50+
属性:
51+
52+
```javascript
53+
DOMDataTransfer clipboardData
54+
```
55+
56+
57+
### 键盘事件
58+
59+
事件名称:
60+
61+
```
62+
onKeyDown onKeyPress onKeyUp
63+
```
64+
65+
属性:
66+
67+
```javascript
68+
boolean altKey
69+
Number charCode
70+
boolean ctrlKey
71+
function getModifierState(key)
72+
String key
73+
Number keyCode
74+
String locale
75+
Number location
76+
boolean metaKey
77+
boolean repeat
78+
boolean shiftKey
79+
Number which
80+
```
81+
82+
83+
### 焦点事件
84+
85+
事件名称
86+
87+
```
88+
onFocus onBlur
89+
```
90+
91+
属性:
92+
93+
```javascript
94+
DOMEventTarget relatedTarget
95+
```
96+
97+
98+
### 表单事件
99+
100+
事件名称:
101+
102+
```
103+
onChange onInput onSubmit
104+
```
105+
106+
关于 `onChange` 事件的更多信息,参见 [表单组件](/react/docs/forms-zh-CN.html)。
107+
108+
109+
### 鼠标事件
110+
111+
事件名称:
112+
113+
```
114+
onClick onDoubleClick onDrag onDragEnd onDragEnter onDragExit onDragLeave
115+
onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave
116+
onMouseMove onMouseOut onMouseOver onMouseUp
117+
```
118+
119+
属性:
120+
121+
```javascript
122+
boolean altKey
123+
Number button
124+
Number buttons
125+
Number clientX
126+
Number clientY
127+
boolean ctrlKey
128+
function getModifierState(key)
129+
boolean metaKey
130+
Number pageX
131+
Number pageY
132+
DOMEventTarget relatedTarget
133+
Number screenX
134+
Number screenY
135+
boolean shiftKey
136+
```
137+
138+
139+
### 触控事件
140+
141+
在渲染任意组件之前调用 `React.initializeTouchEvents(true)`,以启用触控事件。
142+
143+
事件名称:
144+
145+
```
146+
onTouchCancel onTouchEnd onTouchMove onTouchStart
147+
```
148+
149+
属性:
150+
151+
```javascript
152+
boolean altKey
153+
DOMTouchList changedTouches
154+
boolean ctrlKey
155+
function getModifierState(key)
156+
boolean metaKey
157+
boolean shiftKey
158+
DOMTouchList targetTouches
159+
DOMTouchList touches
160+
```
161+
162+
163+
### 用户界面事件
164+
165+
事件名称:
166+
167+
```
168+
onScroll
169+
```
170+
171+
属性:
172+
173+
```javascript
174+
Number detail
175+
DOMAbstractView view
176+
```
177+
178+
179+
### 滚轮事件
180+
181+
事件名称:
182+
183+
```
184+
onWheel
185+
```
186+
187+
属性:
188+
189+
```javascript
190+
Number deltaMode
191+
Number deltaX
192+
Number deltaY
193+
Number deltaZ
194+
```

0 commit comments

Comments
 (0)