@@ -6,7 +6,7 @@ prev: hello-world.html
6
6
next : rendering-elements.html
7
7
---
8
8
9
- 考虑如下声明变量 :
9
+ 考虑如下变量声明 :
10
10
11
11
``` js
12
12
const element = < h1> Hello, world! < / h1> ;
@@ -16,21 +16,21 @@ const element = <h1>Hello, world!</h1>;
16
16
17
17
它被称为 JSX,是一个 JavaScript 的语法扩展。我们建议在 React 中配合使用 JSX,JSX 可以很好地描述 UI 应该呈现出它应有交互的本质形式。JSX 可能会使人联想到模版语言,但它具有 JavaScript 的全部功能。
18
18
19
- JSX 可以生成 React “元素”。我们将在[ 下一章节] ( /docs/rendering-elements.html ) 中探讨如何将这些元素渲染到 DOM 里。下面,我们来看一下开始学习 JSX 的所需的基础知识 。
19
+ JSX 可以生成 React “元素”。我们将在[ 下一章节] ( /docs/rendering-elements.html ) 中探讨如何将这些元素渲染为 DOM。下面我们看下学习 JSX 所需的基础知识 。
20
20
21
21
### 为什么使用 JSX? {#why-jsx}
22
22
23
- React 认为渲染逻辑本质上与其他 UI 逻辑一脉相通 ,比如,如何处理事件、状态如何变化以及如何把数据展示出来 。
23
+ React 认为渲染逻辑本质上与其他 UI 逻辑内在耦合 ,比如,如何处理事件、状态如何随时间变化,以及如何展示准备好的数据 。
24
24
25
- React 并没有把标记语言和逻辑这两个东西分开放在不同的文件里,而是使用松散耦合的单元进行 [ 关注点* 分离* ] ( https://en.wikipedia.org/wiki/Separation_of_concerns ) ,我们将包含两者的单元称为“组件”。我们会在 [ 延伸章节 ] ( /docs/components-and-props.html ) 里重新探讨“组件”,但如果你还不熟悉怎么在 JS 里使用标记语言,请查看 [ 视频讲解 ] ( https://www.youtube.com/watch?v=x7cQ3mrcKaY ) 。
25
+ React 并没有采用将 * 标记与逻辑进行分离到不同文件 * 这种人为地分离方式 * ,而是通过将二者共同存放在称之为“组件”的松散耦合单元之中,来实现 [ 关注点* 分离* ] ( https://en.wikipedia.org/wiki/Separation_of_concerns ) 。我们将在 [ 后面章节 ] ( /docs/components-and-props.html ) 中深入学习组件。如果你还没有适应在 JS 中使用标记语言,这个 [ 会议讨论 ] ( https://www.youtube.com/watch?v=x7cQ3mrcKaY ) 应该可以说服你 。
26
26
27
- React [ 不一定要使用 JSX ] ( /docs/react-without-jsx.html ) ,但是大多数人在 JavaScript 代码中编写 UI 时,发现它是一种非常好的视觉辅助工具。它还允许 React 显示更多有用的错误和警告消息。
27
+ React [ 不强制要求 ] ( /docs/react-without-jsx.html ) 使用 JSX,但是大多数人发现,在 JavaScript 代码中将 JSX 和 UI 放在一起时,会在视觉上有辅助作用。它还可以使 React 显示更多有用的错误和警告消息。
28
28
29
- 弄清楚这个,让我们开始吧 !
29
+ 搞清楚这个问题后,我们就开始学习 JSX 吧 !
30
30
31
31
### 在 JSX 中嵌入表达式 {#embedding-expressions-in-jsx}
32
32
33
- 在下面的例子中,我们声明了一个名为 ` name ` 的变量,然后在 JSX 中使用它,并将它包装在大括号中 :
33
+ 在下面的例子中,我们声明了一个名为 ` name ` 的变量,然后在 JSX 中使用它,并将它包裹在大括号中 :
34
34
35
35
``` js{1,2}
36
36
const name = 'Josh Perez';
@@ -42,7 +42,7 @@ ReactDOM.render(
42
42
);
43
43
```
44
44
45
- 你可以在 JSX 中的大括号内放置任何有效的 [ JavaScript 表达式] ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators#Expressions ) 。例如,` 2 + 2 ` ,` user.firstName ` 或 ` formatName(user) ` 都是有效的 JavaScript 表达式。
45
+ 在 JSX 语法中,你可以在大括号内放置任何有效的 [ JavaScript 表达式] ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators#Expressions ) 。例如,` 2 + 2 ` ,` user.firstName ` 或 ` formatName(user) ` 都是有效的 JavaScript 表达式。
46
46
47
47
在下面的示例中,我们将调用 JavaScript 函数 ` formatName(user) ` 的结果,并将结果嵌入到 ` <h1> ` 元素中。
48
48
@@ -70,13 +70,13 @@ ReactDOM.render(
70
70
71
71
[ 在 CodePen 上尝试] ( codepen://introducing-jsx )
72
72
73
- 为了便于阅读,我们将 JSX 拆分为多行。虽然开发时并不需要这样,但在执行此操作时,我们还是建议将其包装在小括号中,以避免掉入 [ 分号自动插入 ] ( https ://stackoverflow.com/q/2846283) 的陷阱 。
73
+ 为了便于阅读,我们会将 JSX 拆分为多行。同时,我们建议将内容包裹在括号中,虽然这样做不是强制要求的,但是这可以避免遇到 [ 自动插入分号 ] ( http ://stackoverflow.com/q/2846283) 陷阱 。
74
74
75
- ### JSX 本身也是一种表达式 {#jsx-is-an-expression-too}
75
+ ### JSX 也是一个表达式 {#jsx-is-an-expression-too}
76
76
77
- 编译之后 ,JSX 表达式成为常规 JavaScript 函数调用,并评估为 JavaScript 对象。
77
+ 在编译之后 ,JSX 表达式会被转为普通 JavaScript 函数调用,并且对其取值后得到 JavaScript 对象。
78
78
79
- 这意味着你可以在 ` if ` 语句和 ` for ` 循环中使用 JSX,将其赋值给变量,或作为参数传递,再或者作为函数返回值返回 :
79
+ 也就是说,你可以在 ` if ` 语句和 ` for ` 循环的代码块中使用 JSX,将 JSX 赋值给变量,把 JSX 当作参数传入,以及从函数中返回 JSX :
80
80
81
81
``` js{3,5}
82
82
function getGreeting(user) {
@@ -87,37 +87,37 @@ function getGreeting(user) {
87
87
}
88
88
```
89
89
90
- ### JSX 属性 {#specifying-attributes-with-jsx}
90
+ ### JSX 特定属性 {#specifying-attributes-with-jsx}
91
91
92
- 你可以使用引号来为字符串类型的属性赋值 :
92
+ 你可以通过使用引号,来将属性值指定为字符串字面量 :
93
93
94
94
``` js
95
95
const element = < div tabIndex= " 0" >< / div> ;
96
96
```
97
97
98
- 也可以使用大括号来定义以 JavaScript 表达式为值的属性 :
98
+ 也可以使用大括号,来在属性值中插入一个 JavaScript 表达式 :
99
99
100
100
``` js
101
101
const element = < img src= {user .avatarUrl }>< / img> ;
102
102
```
103
103
104
- 切记,如果把 JavaScript 表达式镶嵌在大括号里,大括号外面不能再套引号。JSX 会将引号当中的内容识别为字符串而不是表达式。你可以只使用引号(当对象是字符串),或者使用大阔号(当对象是表达式),但这两个不能在同一个属性里出现 。
104
+ 在属性中嵌入 JavaScript 表达式时,不要在大括号外面加上引号。你应该仅使用引号(对于字符串值)或大括号(对于表达式)中的一个,对于同一属性不能同时使用这两种符号 。
105
105
106
106
> ** 警告:**
107
107
>
108
- > 因为 JSX 的特性更接近 JavaScript 而不是 HTML,所以 React DOM 使用 ` camelCase ` (小驼峰命名)来定义属性的名称,而不是 HTML 的属性名称 。
108
+ > 因为 JSX 语法上更接近 JavaScript 而不是 HTML,所以 React DOM 使用 ` camelCase ` (小驼峰命名)来定义属性的名称,而不使用 HTML 属性名称的命名约定 。
109
109
>
110
- > 例如,JSX 里的 ` class ` 变成了 [ ` className ` ] ( https://developer.mozilla.org/en-US/docs/Web/API/Element/className ) ,而 ` tabindex ` 则对应着 [ ` tabIndex ` ] ( https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/tabIndex ) 。
110
+ > 例如,JSX 里的 ` class ` 变成了 [ ` className ` ] ( https://developer.mozilla.org/en-US/docs/Web/API/Element/className ) ,而 ` tabindex ` 则变为 [ ` tabIndex ` ] ( https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/tabIndex ) 。
111
111
112
- ### 使用 JSX 指定子项 {#specifying-children-with-jsx}
112
+ ### 使用 JSX 指定子元素 {#specifying-children-with-jsx}
113
113
114
- 假如一个标签里面没有内容,你可以把它当作 XML,在末尾加上 ` /> ` 来关上它。
114
+ 假如一个标签里面没有内容,你可以使用 ` /> ` 来闭合标签,就像 XML 语法一样:
115
115
116
116
``` js
117
117
const element = < img src= {user .avatarUrl } / > ;
118
118
```
119
119
120
- JSX 标签里能够包含很多子项 :
120
+ JSX 标签里能够包含很多子元素 :
121
121
122
122
``` js
123
123
const element = (
@@ -130,21 +130,21 @@ const element = (
130
130
131
131
### JSX 防止注入攻击 {#jsx-prevents-injection-attacks}
132
132
133
- 你可以放心地在 JSX 当中使用用户输入 :
133
+ 你可以安全地在 JSX 当中插入用户输入内容 :
134
134
135
135
``` js
136
136
const title = response .potentiallyMaliciousInput ;
137
137
// 直接使用是安全的:
138
138
const element = < h1> {title}< / h1> ;
139
139
```
140
140
141
- React DOM 在渲染之前默认会 [ 过滤 ] ( https://stackoverflow.com/questions/7381974/which-characters-need-to-be-escaped-on-html ) 所有传入的值。它可以确保你的应用里没有写进去的信息无法被进行注入攻击 。所有的内容在渲染之前都被转换成了字符串。这样可以有效地防止 [ XSS(cross-site-scripting, 跨站脚本)] ( https://en.wikipedia.org/wiki/Cross-site_scripting ) 攻击。
141
+ React DOM 在渲染所有输入内容之前,默认会进行 [ 转义 ] ( https://stackoverflow.com/questions/7381974/which-characters-need-to-be-escaped-on-html ) 。它可以确保在你的应用中,永远不会注入那些并非自己明确编写的内容 。所有的内容在渲染之前都被转换成了字符串。这样可以有效地防止 [ XSS(cross-site-scripting, 跨站脚本)] ( https://en.wikipedia.org/wiki/Cross-site_scripting ) 攻击。
142
142
143
- ### JSX 代表对象(Objects) {#jsx-represents-objects}
143
+ ### JSX 表示对象 {#jsx-represents-objects}
144
144
145
- Babel 转译器会把 JSX 转换成一个名为 ` React.createElement() ` 的方法调用 。
145
+ Babel 会把 JSX 转译成一个名为 ` React.createElement() ` 函数调用 。
146
146
147
- 下面两种代码的作用是完全相同的 :
147
+ 以下两种示例代码完全等效 :
148
148
149
149
``` js
150
150
const element = (
@@ -162,10 +162,10 @@ const element = React.createElement(
162
162
);
163
163
```
164
164
165
- ` React.createElement() ` 这个方法首先会进行一些避免 bug 的检查,但更主要的是返回一个类似下面例子的对象 :
165
+ ` React.createElement() ` 会预先执行一些检查,以帮助你编写无错代码,但实际上它创建了一个这样的对象 :
166
166
167
167
``` js
168
- // 注意:这是简化后的示例
168
+ // 注意:这是简化过的结构
169
169
const element = {
170
170
type: ' h1' ,
171
171
props: {
@@ -175,10 +175,10 @@ const element = {
175
175
};
176
176
```
177
177
178
- 这样的对象被称为 “React 元素”。它代表所有你在屏幕上看到的东西 。React 通过读取这些对象来构建 DOM 并保持随时更新 。
178
+ 这些对象被称为 “React 元素”。它们描述了你希望在屏幕上看到的内容 。React 通过读取这些对象,然后使用它们来构建 DOM 以及保持随时更新 。
179
179
180
- 我们将在下一节中探讨如何将 React 元素渲染到 DOM。
180
+ 我们将在下一章节中探讨如何将 React 元素渲染为 DOM。
181
181
182
182
> ** 提示:**
183
183
>
184
- > 我们建议您使用 [ “Babel” 编辑器插件 ] ( https://babeljs.io/docs/editors ) 作为你所使用编辑器的辅助,以使得 ES6 和 JSX 代码高亮。本网站使用与之兼容的 [ Oceanic Next] ( https://labs.voronianski.com/oceanic-next-color-scheme/ ) 配色方案。
184
+ > 我们推荐在你使用的编辑器中,使用 [ “Babel” 提供的语言定义 ] ( https://babeljs.io/docs/editors ) ,来正确地高亮显示 ES6 和 JSX 代码。本网站使用与其兼容的 [ Oceanic Next] ( https://labs.voronianski.com/oceanic-next-color-scheme/ ) 配色方案。
0 commit comments