Skip to content

Commit a9a4c9d

Browse files
committed
Update zh-docs with 7e2a7f0
1 parent 7e2a7f0 commit a9a4c9d

17 files changed

+180
-439
lines changed

docs/docs/02-displaying-data.zh-CN.md

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
---
22
id: displaying-data-zh-CN
33
title: 显示数据
4-
layout: docs
54
permalink: displaying-data-zh-CN.html
65
prev: why-react-zh-CN.html
76
next: jsx-in-depth-zh-CN.html
87
---
98

109
用户界面能做的最基础的事就是显示一些数据。React 让显示数据变得简单,当数据变化的时候,用户界面会自动同步更新。
1110

12-
1311
## 开始
1412

1513
让我们看一个非常简单的例子。新建一个名为 `hello-react.html` 的文件,代码内容如下:
@@ -57,7 +55,6 @@ setInterval(function() {
5755
}, 500);
5856
```
5957

60-
6158
## 被动更新 (Reactive Updates)
6259

6360
在浏览器中打开 `hello-react.html` ,在输入框输入你的名字。你会发现 React 在用户界面中只改变了时间, 任何你在输入框输入的内容一直保留着,即使你没有写任何代码来完成这个功能。React 为你解决了这个问题,做了正确的事。
@@ -66,7 +63,6 @@ setInterval(function() {
6663

6764
对这个组件的输入称为 `props` - "properties"的缩写。得益于 JSX 语法,它们通过参数传递。你必须知道在组件里,这些属性是不可改变的,也就是说 **`this.props` 是只读的**
6865

69-
7066
## 组件就像是函数
7167

7268
React 组件非常简单。你可以认为它们就是简单的函数,接受 `props``state` (后面会讨论) 作为参数,然后渲染出 HTML。正是应为它们是这么的简单,这使得它们非常容易理解。
@@ -75,12 +71,13 @@ React 组件非常简单。你可以认为它们就是简单的函数,接受 `
7571
>
7672
> **只有一个限制**: React 组件只能渲染单个根节点。如果你想要返回多个节点,它们*必须*被包含在同一个节点里。
7773
78-
7974
## JSX 语法
8075

8176
我们坚信组件是正确方法去做关注分离,而不是通过“模板”和“展示逻辑”。我们认为标签和生成它的代码是紧密相连的。此外,展示逻辑通常是很复杂的,通过模板语言实现这些逻辑会产生大量代码。
8277

83-
我们得出解决这个问题最好的方案是通过 JavaScript 直接生成模板,这样你就可以用一个真正语言的所有表达能力去构建用户界面。为了使这变得更简单,我们做了一个非常简单、**可选**类似 HTML 语法 ,通过函数调用即可生成模板的编译器,称为 JSX。
78+
我们得出解决这个问题最好的方案是通过 JavaScript 直接生成模板,这样你就可以用一个真正语言的所有表达能力去构建用户界面。
79+
80+
为了使这变得更简单,我们做了一个非常简单、**可选**类似 HTML 语法 ,通过函数调用即可生成模板的编译器,称为 JSX。
8481

8582
**JSX 让你可以用 HTML 语法去写 JavaScript 函数调用** 为了在 React 生成一个链接,通过纯 JavaScript 你可以这么写:
8683

@@ -125,4 +122,3 @@ var root = React.DOM.ul({ className: 'my-list' },
125122
React.DOM.li(null, 'Text Content')
126123
);
127124
```
128-

docs/docs/02.1-jsx-in-depth.md

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,7 @@ var Nav = React.createClass({ });
8282
var Nav = React.createClass({displayName: "Nav", });
8383
```
8484

85-
Use the [Babel REPL](https://babeljs.io/repl/) to try out JSX and see how it
86-
desugars into native JavaScript, and the
87-
[HTML to JSX converter](/react/html-jsx.html) to convert your existing HTML to
88-
JSX.
85+
Use the [Babel REPL](https://babeljs.io/repl/) to try out JSX and see how it desugars into native JavaScript, and the [HTML to JSX converter](/react/html-jsx.html) to convert your existing HTML to JSX.
8986

9087
If you want to use JSX, the [Getting Started](/react/docs/getting-started.html) guide shows how to set up compilation.
9188

@@ -163,8 +160,7 @@ var App = (
163160

164161
### Attribute Expressions
165162

166-
To use a JavaScript expression as an attribute value, wrap the expression in a
167-
pair of curly braces (`{}`) instead of quotes (`""`).
163+
To use a JavaScript expression as an attribute value, wrap the expression in a pair of curly braces (`{}`) instead of quotes (`""`).
168164

169165
```javascript
170166
// Input (JSX):

docs/docs/02.1-jsx-in-depth.zh-CN.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ next: jsx-spread-zh-CN.html
88

99
[JSX](https://facebook.github.io/jsx/) 是一个看起来很像 XML 的 JavaScript 语法扩展。React 可以用来做简单的 JSX 句法转换。
1010

11-
1211
## 为什么要用 JSX?
1312

1413
你不需要为了 React 使用 JSX,可以直接使用原生 JS。但是,我们建议使用 JSX 是因为它能精确,也是常用的定义包含属性的树状结构的语法。
@@ -46,7 +45,6 @@ React 的 JSX 使用大、小写的约定来区分本地组件的类和 HTML 标
4645
> 由于 JSX 就是 JavaScript,一些标识符像 `class``for` 不建议作为 XML
4746
> 属性名。作为替代,React DOM 使用 `className``htmlFor` 来做对应的属性。
4847
49-
5048
## 转换(Transform)
5149

5250
JSX 把类 XML 的语法转成原生 JavaScript,XML 元素、属性和子节点被转换成 `React.createElement` 的参数。
@@ -90,6 +88,7 @@ var Nav = React.createClass({displayName: "Nav", });
9088

9189
> 注意:
9290
>
91+
>
9392
> JSX 表达式总是会当作 ReactElement 执行。具体的实际细节可能不同。一种优化
9493
> 的模式是把 ReactElement 当作一个行内的对象字面量形式来绕过
9594
> `React.createElement` 里的校验代码。

docs/docs/02.2-jsx-spread.zh-CN.md

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ next: jsx-gotchas-zh-CN.html
1212
var component = <Component foo={x} bar={y} />;
1313
```
1414

15-
1615
## 修改 Props 是不好的,明白吗
1716

1817
如果你不知道要设置哪些 Props,那么现在最好不要设置它:
@@ -27,7 +26,6 @@ next: jsx-gotchas-zh-CN.html
2726

2827
Props 应该被认为是不可变的。在别处修改 props 对象可能会导致预料之外的结果,所以原则上这将是一个冻结的对象。
2928

30-
3129
## 展开属性(Spread Attributes)
3230

3331
现在你可以使用 JSX 的新特性 - 展开属性:
@@ -49,7 +47,6 @@ Props 应该被认为是不可变的。在别处修改 props 对象可能会导
4947
console.log(component.props.foo); // 'override'
5048
```
5149

52-
5350
## 这个奇怪的 `...` 标记是什么?
5451

55-
这个 `...` 操作符(增强的操作符)已经被 [ES6 数组](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator) 支持。相关的还有 ES7 规范草案中的 [Object 剩余和展开属性(Rest and Spread Properties)](https://github.com/sebmarkbage/ecmascript-rest-spread)。我们利用了这些还在制定中标准中已经被支持的特性来使 JSX 拥有更优雅的语法。
52+
这个 `...` 操作符(增强的操作符)已经被 [ES6 数组](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator) 支持。相关的还有 ECMAScript 规范草案中的 [Object 剩余和展开属性(Rest and Spread Properties)](https://github.com/sebmarkbage/ecmascript-rest-spread)。我们利用了这些还在制定中标准中已经被支持的特性来使 JSX 拥有更优雅的语法。

docs/docs/02.3-jsx-gotchas.zh-CN.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ HTML 实体可以插入到 JSX 的文本中。
5252
<div dangerouslySetInnerHTML={{'{{'}}__html: 'First &middot; Second'}} />
5353
```
5454

55+
5556
## 自定义 HTML 属性
5657

5758
如果往原生 HTML 元素里传入 HTML 规范里不存在的属性,React 不会显示它们。如果需要使用自定义属性,要加 `data-` 前缀。
@@ -60,6 +61,12 @@ HTML 实体可以插入到 JSX 的文本中。
6061
<div data-custom-attribute="foo" />
6162
```
6263

64+
然而,在自定义元素中任意的属性都是被支持的 (那些在tag名里带有连接符或者 `is="..."` 属性的)
65+
66+
```javascript
67+
<x-my-component custom-attribute="foo" />
68+
```
69+
6370
`aria-` 开头的 [网络无障碍](http://www.w3.org/WAI/intro/aria) 属性可以正常使用。
6471

6572
```javascript

docs/docs/03-interactivity-and-dynamic-uis.zh-CN.md

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ next: multiple-components-zh-CN.html
88

99
我们已经学习如何使用 React [显示数据](/react/docs/displaying-data-zh-CN.html)。现在让我们来学习如何创建交互式界面。
1010

11-
1211
## 简单例子
1312

1413
```javascript
@@ -35,7 +34,6 @@ ReactDOM.render(
3534
);
3635
```
3736

38-
3937
## 事件处理与合成事件(Synthetic Events)
4038

4139
React 里只需把事件处理器(event handler)以骆峰命名(camelCased)形式当作组件的 props 传入即可,就像使用普通 HTML 那样。React 内部创建一套合成事件系统来使所有事件在 IE8 和以上浏览器表现一致。也就是说,React 知道如何冒泡和捕获事件,而且你的事件处理器接收到的 events 参数与 [W3C 规范](http://www.w3.org/TR/DOM-Level-3-Events/) 一致,无论你使用哪种浏览器。
@@ -48,19 +46,16 @@ React 里只需把事件处理器(event handler)以骆峰命名(camelCased
4846

4947
**事件代理 :** React 实际并没有把事件处理器绑定到节点本身。当 React 启动的时候,它在最外层使用唯一一个事件监听器处理所有事件。当组件被加载和卸载时,只是在内部映射里添加或删除事件处理器。当事件触发,React 根据映射来决定如何分发。当映射里处理器时,会当作空操作处理。参考 [David Walsh 很棒的文章](http://davidwalsh.name/event-delegate) 了解这样做高效的原因。
5048

51-
5249
## 组件其实是状态机(State Machines)
5350

5451
React 把用户界面当作简单状态机。把用户界面想像成拥有不同状态然后渲染这些状态,可以轻松让用户界面和数据保持一致。
5552

5653
React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。React 来决定如何最高效地更新 DOM。
5754

58-
5955
## State 工作原理
6056

6157
常用的通知 React 数据变化的方法是调用 `setState(data, callback)`。这个方法会合并(merge) `data``this.state`,并重新渲染组件。渲染完成后,调用可选的 `callback` 回调。大部分情况下不需要提供 `callback`,因为 React 会负责把界面更新到最新状态。
6258

63-
6459
## 哪些组件应该有 State?
6560

6661
大部分组件的工作应该是从 `props` 里取数据并渲染出来。但是,有时需要对用户输入、服务器请求或者时间变化等作出响应,这时才需要使用 State。
@@ -69,16 +64,14 @@ React 里,只需更新组件的 state,然后根据新的 state 重新渲染
6964

7065
常用的模式是创建多个只负责渲染数据的无状态(stateless)组件,在它们的上层创建一个有状态(stateful)组件并把它的状态通过 `props` 传给子级。这个有状态的组件封装了所有用户的交互逻辑,而这些无状态组件则负责声明式地渲染数据。
7166

72-
7367
## 哪些 *应该* 作为 State?
7468

7569
**State 应该包括那些可能被组件的事件处理器改变并触发用户界面更新的数据。** 真实的应用中这种数据一般都很小且能被 JSON 序列化。当创建一个状态化的组件时,想象一下表示它的状态最少需要哪些数据,并只把这些数据存入 `this.state`。在 `render()` 里再根据 state 来计算你需要的其它数据。你会发现以这种方式思考和开发程序最终往往是正确的,因为如果在 state 里添加冗余数据或计算所得数据,需要你经常手动保持数据同步,不能让 React 来帮你处理。
7670

77-
7871
## 哪些 *不应该* 作为 State?
7972

8073
`this.state` 应该仅包括能表示用户界面状态所需的最少数据。因些,它不应该包括:
8174

8275
* **计算所得数据:** 不要担心根据 state 来预先计算数据 —— 把所有的计算都放到 `render()` 里更容易保证用户界面和数据的一致性。例如,在 state 里有一个数组(listItems),我们要把数组长度渲染成字符串, 直接在 `render()` 里使用 `this.state.listItems.length + ' list items'` 比把它放到 state 里好的多。
8376
* **React 组件:**`render()` 里使用当前 props 和 state 来创建它。
84-
* **基于 props 的重复数据:** 尽可能使用 props 来作为惟一数据来源。把 props 保存到 state 的一个有效的场景是需要知道它以前值的时候,因为未来的 props 可能会变化
77+
* **基于 props 的重复数据:** 尽可能使用 props 来作为实际状态的源。把 props 保存到 state 的一个有效的场景是需要知道它以前值的时候,因为 props 可能因为父组件重绘的结果而变化

docs/docs/04-multiple-components.zh-CN.md

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ next: reusable-components-zh-CN.html
88

99
目前为止,我们已经学了如何用单个组件来展示数据和处理用户输入。下一步让我们来体验 React 最激动人心的特性之一:可组合性(composability)。
1010

11-
1211
## 动机:关注分离
1312

1413
通过复用那些接口定义良好的组件来开发新的模块化组件,我们得到了与使用函数和类相似的好处。具体来说就是能够通过开发简单的组件把程序的*不同关注面分离*。如果为程序开发一套自定义的组件库,那么就能以最适合业务场景的方式来展示你的用户界面。
@@ -53,15 +52,12 @@ ReactDOM.render(
5352
);
5453
```
5554

56-
5755
## 从属关系
5856

59-
上面例子中,`Avatar` 拥有 `ProfilePic``ProfileLink` 的实例。`拥有者` 就是给其它组件设置 `props` 的那个组件。更正式地说,
60-
如果组件 `Y``render()` 方法是创建了组件 `X`,那么 `Y` 就拥有 `X`。上面讲过,组件不能修改自身的 `props` - 它们总是与它们拥有者设置的保持一致。这是保持用户界面一致性的基本不变量。
57+
上面例子中,`Avatar` 拥有 `ProfilePic``ProfileLink` 的实例。`拥有者` 就是给其它组件设置 `props` 的那个组件。更正式地说,如果组件 `Y``render()` 方法是创建了组件 `X`,那么 `Y` 就拥有 `X`。上面讲过,组件不能修改自身的 `props` - 它们总是与它们拥有者设置的保持一致。这是保持用户界面一致性的基本不变量。
6158

6259
把从属关系与父子关系加以区别至关重要。从属关系是 React 特有的,而父子关系简单来讲就是DOM 里的标签的关系。在上一个例子中,`Avatar` 拥有 `div``ProfilePic``ProfileLink` 实例,`div``ProfilePic``ProfileLink` 实例的**父级**(但不是拥有者)。
6360

64-
6561
## 子级
6662

6763
实例化 React 组件时,你可以在开始标签和结束标签之间引用在React 组件或者Javascript 表达式:

docs/docs/05-reusable-components.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,7 @@ React.createClass({
8080

8181
### Single Child
8282

83-
With `React.PropTypes.element` you can specify that only a single child can be passed to
84-
a component as children.
83+
With `React.PropTypes.element` you can specify that only a single child can be passed to a component as children.
8584

8685
```javascript
8786
var MyComponent = React.createClass({

0 commit comments

Comments
 (0)