ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 引入 JSX 考虑这个变量声明: ~~~ const element = <h1>Hello, world!</h1>; ~~~ 这个有趣的标记语法既不是字符串,也不是 HTML 。 它称为 JSX ,是一个 JavaScript 的语法扩展。我们建议使用它编写 React 来描述 UI 的外观。JSX 可能使你想起一个模板语言,但是它却有完整的 JavaScript 的能力。 JSX 生产 React 元素。我们将在下一节探索渲染它们到 DOM 中。下面,你可以找到找到使用 JSX 的基础的需求,来开始学习它。 ## 在 JSX 中嵌入表达式 在 JSX 中可以嵌入任何 [JavaScript 表达式](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators#Expressions),通过 花括号包起来。 例如, 2+2 ,uesr.name,和 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') ); ~~~ [在 CodePen 中打开它](http://codepen.io/gaearon/pen/PGEjdG?editors=0010)。 分隔 JSX 为多行可以更加易读。但这并不是强制的,当这样做时,我们还建议放在括号中以避免[自动补全分号](http://stackoverflow.com/q/2846283)的陷阱。 ## JSX 也是表达式 编译之后,JSX 表达式变成常规的 JavaScript 对象。 这意味着你可以使用 JSX 在语句中或者用于循环、赋值到变量、作为参数、或者函数的返回值。 ~~~ function getGreeting(user) { if (user) { return <h1>Hello, {formatName(user)}!</h1>; } return <h1>Hello, Stranger.</h1>; } ~~~ ## 使用 JSX 指定属性 可以使用双引号来指定字符串字面量作为属性: ~~~ const element = <div tabIndex="0"></div>; ~~~ 还可以使用花括号来嵌入一个 JavaScript 表达式作为一个属性: ~~~ const element = <img src={user.avatarUrl}></img>; ~~~ ## JSX 中的 子元素 如果一个标签是空的,你可以立即关闭它,使用 `/>`,就像 XML: ~~~ const element = <img src={user.avatarUrl} />; ~~~ JSX 标签可以包含子元素: ~~~ const element = ( <div> <h1>Hello!</h1> <h2>Good to see you here.</h2> </div> ); ~~~ >[warning] 警告: 由于JSX 相较 HTML 要更接近 JavaScript,React DOM 使用驼峰属性命名惯例,而不是 HTML 属性的名称形式。 比如, 在 JSX 中, class 属性成为 className,tabindex 属性成为 tabIndex 。 ## JSX 防止注入式攻击 在 JSX 中嵌入用户输入是安全的: ~~~ const title = response.potentiallyMaliciousInput; // This is safe: const element = <h1>{title}</h1>; ~~~ 默认, React DOM 在渲染它们之前将转义任何嵌入到 JSX 中的 值。因此它确保你不会被注入任何你应用中没有明确指出的内容。任何内容在被渲染之前都被转换成字符串。这有助于阻止[ XSS 攻击](https://en.wikipedia.org/wiki/Cross-site_scripting)。 ## JSX 代表的对象 Babel 编译 JSX 到 React.createElement() 调用。 这两个例子是相同的: ~~~ const element = ( <h1 className="greeting"> Hello, world! </h1> ); ~~~ ~~~ const element = React.createElement( 'h1', {className: 'greeting'}, 'Hello, world!' ); ~~~ React.createElement() 执行一些检查来帮助你编写更少 bug 的代码,但是本质上它像这样创建一个对象: ~~~ // Note: this structure is simplified const element = { type: 'h1', props: { className: 'greeting', children: 'Hello, world' } }; ~~~ 这些对象被称为 React 元素。你可以当它们是你希望在屏幕上看到的内容的描述。React 读取这些对象并使用它们构成 DOM 并保持它们最新。 下一节我们将探索渲染 React 元素到 DOM 中。 > 贴士: 我们建议为你的编辑器搜索一个 "Babel" 语法插件,那么 ES6 和 JSX 代码都能正确的高亮显示。