React教程 - 2. 学习JSX
本文译自React官方文档
全文翻译及相关代码,请参看我的Github
首先看看以下代码段:
const element = <h1>Hello, world!</h1>;
这个有趣的标签表达式既不是一个字符串,也不是一个HTML标签。
它叫做JSX,是JavaScript的扩展。我们推荐在React中使用JSX描述UI。
JSX也许会使你想起某种模板语言,它可以充分利用JavaScript的特性。
JSX创建React元素。我们将再下一章节学习如何将其渲染至DOM。接下来,我们将学习JSX的基本用法。
1.在JSX中嵌入表达式
在JSX中,您可以通过 {} 的方式嵌入任何JavaScript表达式。
如 2+2, user.firstName, 和 formatName(user) 等均为有效的表达式:
function formatName(user) {
return user.firstName + ' ' + user.lastName;
}
const user = {
firstName: 'Harper',
lastName: 'Perez'
};
const element = (
<h1>
Hello, {formatName(user)}!
</h1>
);
ReactDOM.render(
element,
document.getElementById('root')
);
从可读性的角度考虑,我们将JSX分成了多行。但这并不是强制性的。
当需要分行时,我们推荐使用圆括号 () 将其括起,从而避免JS的自动插入机制ASI
2.JSX也是表达式
通过编译后,JSX表达式变成了常规的JavaScript对象。
这意味着您可以使用JSX中使用 if 语句和 for 循环等:
function getGreeting(user) {
if (user) {
return <h1>Hello, {formatName(user)}!</h1>;
}
return <h1>Hello, Stranger.</h1>;
}
3.使用JSX指定标签属性
您可以使用引号 “” 将字符串指定为属性:
const element = <div tabIndex="0"></div>;
也可以使用括号 {} 嵌入JavaScript表达式作为属性:
const element = <img src={user.avatarUrl}></img>;
但是,当通过JavaScript表达式未属性赋值时,不要使用双引号。
否则,JSX会将其视为一个字符串而非JavaScript表达式。
对于字符串,我们可以直接使用 “” 将其作为属性值;对于表达式,我们可以通过 {} 将其作为属性值。
但是不要将其混用。
4.使用JSX指定子元素
当某tag不含值时,可以直接用 /> 将其关闭:
const element = <img src={user.avatarUrl} />;
JSX的标记可以包含子元素:
const element = (
<div>
<h1>Hello!</h1>
<h2>Good to see you here.</h2>
</div>
);
注意,由于相对HTML而言,JSX更加类似于JavaScript, React DOM使用驼峰命名代替HTML中的属性名。
例如,JSX中使用 className 而非 class , 使用 tabIndex 而非 tabindex
5.JSX能够防注入攻击
在JSX中直接嵌入用户输入是安全的:
const title = response.potentiallyMaliciousInput;
// This is safe:
const element = <h1>{title}</h1>;
在执行渲染前,React DOM会默认对任何嵌入的值进行编码。
这可以避免应用被注入,可以避免XSS攻击。
6.JSX表示对象
Babel将JSX编译为 React.createElement() 调用。
以下两种写法是一致的:
const element = (
<h1 className="greeting">
Hello, world!
</h1>
);
const element = React.createElement(
'h1',
{className: 'greeting'},
'Hello, world!'
);
React.createElement() 会执行一些语法方面的检查,但其核心功能是创建一个如下的对象:
const element = {
...
type: 'h1',
props: {
className: 'greeting',
children: 'Hello, world'
}
...
};
这些对象被称为”React元素”。我们可以将其视为我们想要在屏幕上表现的元素的描述。React读取这些对象并利用他们构建DOM并保持更新。
我们将在下一部分学习将React元素渲染成DOM。
Tip:
为了ES6和JSX都能在编辑器中高亮显示,我们推荐您将您的编辑器设置为”Babel”语法方案。