此文章是翻译Introducing JSX这篇React(版本v15.4.0)官方文档。
Introducing JSX
考虑这个变量声明:
1 | const element = <h1>Hello , world!</h1> |
这个古怪的标签语法既不是string 也不是HTML。
它就是JSX,它是JavaScript 的一个语法扩展。我们建议在React 中使用它去描述UI 的展示。JSX 可能会使你记起模版语言(a template language),但是它使用JavaScript 的所有功能。
JSX 产生React 的elements。我们将在下一章 研究如何将它们渲染为DOM。接下来,你会了解对你使用React 所需要的基本的JSX 知识
Embedding Expressiongs in JSX
你可以在JSX 中,通过大括号(curly braces)来嵌入任何JavaScript expression。
例如,2+2
,user.name
和formatName(user)
都是有效的表达式:
1 | function formatName(user){ |
为了可读性我们将JSX 拆分成多行。虽然它不是强制的,当在拆分JSX 为多行时,我们仍然建议使用括号去包括它,避免automatic semicolon insertion 陷阱。
JSX is an Expression Too
编译之后,JSX 表达式变成了常规的JavaScript 对象。
也就是说,你可以在if
语句和for
循环中,将它赋给一个变量,作为一个参数接受它,并从funcitons 中返回。
1 | function getGreeting(user){ |
Specifying Attributes with JSX
你可以使用引号来指定字符串属性:
1 | const element = <div tabIndex="0"></div> |
在属性中,你也可以在通过使用大括号来包裹JavaScript 表达式:
1 | const element = <img src={user.avatarUrl}></img> |
Specifying Children with JSX
如果一个标签为空,你应该使用/>
来闭合标签,类似XML:
1 | const element = <img src={user.avatarUrl} /> |
JSX 标签可能包含子节点:
1 | const element = ( |
附加说明
由于JSX 更像JavaScript 而不是HTML,因此React DOM 使用camelCase
命名习俗来替代HTML 属性名称
例如:在JSX 中,class
变成className
,tabindex
变成tabIndex
。
JSX Prevents Injection Attacks
在JSX 中嵌入用户输入也是安全的:
1 | const title = response.potentiallyMaliciousInput |
默认,在渲染之前React DOM 转义在JSX 中嵌入的所有值。因此它能确保你永远不能注入任何没有在应用程序写入的东西。在渲染之前所有的东西都被转成字符串。这有助于防止XSS(跨站脚本)攻击。
JSX Represents Objects
Babel 将JSX 编译成通过React.createElement()
方法调用:
下面两个例子是完全一样的:
1 | const element = ( |
1 | const element = React.createElement( |
React.createElement()
执行一些检测来帮助你写出没有bug 的代码,但实际上它创建了如下一个对象:
1 | // Note: this structure is simplified |
这些对象被称为”React elements”。你可以把它们想成描述你想要在屏幕上看的。React 读取这些对象并使用它们构成DOM并保证它们更新。
在下一章中我们将继续探索渲染React elements 为DOM。
Tip:
我们建议在你的编辑器中搜索“Babel”语法格式来使ES6 和JSX 代码正确高亮。