v19.2Latest

使用 JSX 编写标记

JSX是一种 JavaScript 语法扩展,允许你在 JavaScript 文件中编写类似 HTML 的标记。虽然还有其他编写组件的方式,但大多数 React 开发者偏爱 JSX 的简洁性,大多数代码库也使用它。

您将学习
  • 为什么 React 将标记与渲染逻辑混合在一起
  • JSX 与 HTML 有何不同
  • 如何使用 JSX 显示信息

JSX:将标记放入 JavaScript

Web 建立在 HTML、CSS 和 JavaScript 之上。多年来,Web 开发者将内容放在 HTML 中,设计放在 CSS 中,逻辑放在 JavaScript 中——通常放在不同的文件中!内容在 HTML 中进行标记,而页面的逻辑则单独存在于 JavaScript 中:

带有紫色背景的 HTML 标记,包含一个带有两个子标签 p 和 form 的 div。带有紫色背景的 HTML 标记,包含一个带有两个子标签 p 和 form 的 div。

HTML

带有黄色背景的三个 JavaScript 处理程序:onSubmit、onLogin 和 onClick。带有黄色背景的三个 JavaScript 处理程序:onSubmit、onLogin 和 onClick。

JavaScript

但随着 Web 变得更加交互式,逻辑越来越决定内容。JavaScript 负责 HTML!这就是为什么在 React 中,渲染逻辑和标记共存于同一个地方——组件中。

混合了之前示例中 HTML 和 JavaScript 的 React 组件。函数名为 Sidebar,它调用以黄色高亮显示的函数 isLoggedIn。嵌套在以紫色高亮显示的函数内部的是之前的 p 标签,以及引用下一个图表中所示组件的 Form 标签。混合了之前示例中 HTML 和 JavaScript 的 React 组件。函数名为 Sidebar,它调用以黄色高亮显示的函数 isLoggedIn。嵌套在以紫色高亮显示的函数内部的是之前的 p 标签,以及引用下一个图表中所示组件的 Form 标签。

Sidebar.jsReact 组件

混合了之前示例中 HTML 和 JavaScript 的 React 组件。函数名为 Form,包含两个以黄色高亮显示的处理程序 onClick 和 onSubmit。处理程序后面是以紫色高亮显示的 HTML。HTML 包含一个 form 元素,其中嵌套了一个 input 元素,每个元素都有一个 onClick 属性。混合了之前示例中 HTML 和 JavaScript 的 React 组件。函数名为 Form,包含两个以黄色高亮显示的处理程序 onClick 和 onSubmit。处理程序后面是以紫色高亮显示的 HTML。HTML 包含一个 form 元素,其中嵌套了一个 input 元素,每个元素都有一个 onClick 属性。

Form.jsReact 组件

将按钮的渲染逻辑和标记保持在一起,可以确保它们在每次编辑时保持同步。相反,不相关的细节(例如按钮的标记和侧边栏的标记)彼此隔离,使得单独更改其中任何一个更加安全。

每个 React 组件都是一个 JavaScript 函数,可能包含一些 React 渲染到浏览器中的标记。React 组件使用一种称为 JSX 的语法扩展来表示该标记。JSX 看起来很像 HTML,但它更严格一些,并且可以显示动态信息。理解这一点的最佳方法是将一些 HTML 标记转换为 JSX 标记。

注意

JSX 和 React 是两个独立的事物。它们经常一起使用,但你可以独立使用它们。JSX 是一种语法扩展,而 React 是一个 JavaScript 库。

将 HTML 转换为 JSX

假设你有一些(完全有效的)HTML:

并且你想将其放入你的组件中:

如果直接复制粘贴,它将无法工作:

这是因为 JSX 比 HTML 更严格,并且有更多规则!如果你阅读上面的错误信息,它们将指导你修复标记,或者你可以按照下面的指南操作。

注意

大多数情况下,React 屏幕上的错误信息会帮助你找到问题所在。如果遇到困难,请仔细阅读它们!

JSX 的规则

1. 返回单个根元素

要从组件返回多个元素,请用单个父标签包装它们。

例如,你可以使用一个<div>

如果你不想在标记中添加额外的<div>,可以写成 <></>

这个空标签被称为 片段。片段让你可以对元素进行分组,而不会在浏览器的 HTML 树中留下任何痕迹。

Deep Dive
为什么多个 JSX 标签需要被包裹?

2. 闭合所有标签

JSX 要求标签必须显式闭合:自闭合标签如<img>必须写成<img />,而包裹标签如 <li>oranges 必须写成 <li>oranges</li>

以下是海蒂·拉玛的图片和列表项闭合后的样子:

3. 对大多数属性使用驼峰式命名!

JSX 会转换为 JavaScript,而写在 JSX 中的属性会成为 JavaScript 对象的键。在你自己的组件中,你通常会希望将这些属性读取到变量中。但 JavaScript 对变量名有限制。例如,变量名不能包含连字符,也不能是像class这样的保留字。

这就是为什么在 React 中,许多 HTML 和 SVG 属性都采用驼峰式命名。例如,使用stroke-width。由于strokeWidth而不是class是保留字,在 React 中你应写成className,其命名源自 相应的 DOM 属性

你可以在DOM 组件属性列表中查找所有这些属性。如果你写错了,不用担心——React 会在 打印一条包含可能修正建议的消息。浏览器控制台

注意

由于历史原因,aria-*data-*属性在 HTML 中怎么写,在 JSX 中就怎么写(即保留连字符)。

专业提示:使用 JSX 转换器

转换现有标记中的所有属性可能很繁琐!我们建议使用 转换器来将你现有的 HTML 和 SVG 转换为 JSX。转换器在实践中非常有用,但仍然值得理解其背后的原理,以便你能自如地自己编写 JSX。

这是你的最终结果:

回顾

现在你知道了 JSX 存在的原因以及如何在组件中使用它:

  • React 组件将渲染逻辑与标记组合在一起,因为它们是相关的。
  • JSX 与 HTML 类似,但有一些区别。如果需要,你可以使用转换器
  • 错误信息通常会指引你朝着修复标记的正确方向前进。

尝试一些挑战

Challenge 1 of 1:将一些 HTML 转换为 JSX #

这段 HTML 被粘贴到了一个组件中,但它不是有效的 JSX。修复它:

是手动完成还是使用转换器,由你决定!