v19.2Latest

JSX 中的 JavaScript 与大括号

JSX 允许你在 JavaScript 文件中编写类似 HTML 的标记,将渲染逻辑和内容保持在同一个地方。有时你可能想在该标记中添加一点 JavaScript 逻辑或引用动态属性。在这种情况下,你可以在 JSX 中使用大括号来打开通往 JavaScript 的窗口。

您将学习
  • 如何使用引号传递字符串
  • 如何使用大括号在 JSX 内引用 JavaScript 变量
  • 如何使用大括号在 JSX 内调用 JavaScript 函数
  • 如何使用大括号在 JSX 内使用 JavaScript 对象

使用引号传递字符串

当你想向 JSX 传递字符串属性时,可以将其放在单引号或双引号中:

这里,"https://i.imgur.com/7vQD0fPs.jpg""Gregorio Y. Zara"是作为字符串传递的。

但如果你想动态指定 srcalt文本呢?你可以通过将 ""替换为{}来使用 JavaScript 中的值:

请注意 className="avatar"src={avatar}之间的区别:前者指定了一个名为"avatar"的 CSS 类名,使图像变圆;而后者读取名为avatar的 JavaScript 变量的值。这是因为大括号让你可以直接在标记中使用 JavaScript!

使用大括号:通往 JavaScript 世界的窗口

JSX 是一种特殊的 JavaScript 编写方式。这意味着可以在其中使用 JavaScript——通过大括号{ }。下面的示例首先声明了科学家的名字 name,然后使用大括号将其嵌入到 <h1>中:

尝试将 name 的值从 'Gregorio Y. Zara'改为'Hedy Lamarr'。看到列表标题如何变化了吗?

任何 JavaScript 表达式都可以在大括号内使用,包括像formatDate()这样的函数调用:

大括号的使用位置

在 JSX 内部,你只能通过两种方式使用大括号:

  1. 作为文本直接放在 JSX 标签内:<h1>{name}'s To Do List</h1>是有效的,但<{tag}>Gregorio Y. Zara's To Do List</{tag}>则无效。
  2. 作为属性 紧跟在 =符号之后:src={avatar} 会读取 avatar 变量,但 src="{avatar}" 会传递字符串 "{avatar}"

使用“双大括号”:JSX 中的 CSS 和其他对象

除了字符串、数字和其他 JavaScript 表达式之外,你甚至可以在 JSX 中传递对象。对象也用大括号表示,例如{ name: "Hedy Lamarr", inventions: 5 }。因此,要在 JSX 中传递一个 JS 对象,你必须用另一对大括号包裹该对象:person={{ name: "Hedy Lamarr", inventions: 5 }}

你可能会在 JSX 的内联 CSS 样式中看到这种情况。React 不要求你使用内联样式(CSS 类在大多数情况下效果很好)。但当你需要内联样式时,可以将一个对象传递给style 属性:

尝试修改 backgroundColorcolor的值。

当你这样书写时,可以清晰地看到花括号内的 JavaScript 对象:

下次你在 JSX 中看到{{}},要知道它只不过是 JSX 花括号内的一个对象!

注意

内联 style属性使用驼峰式命名。例如,HTML 中的<ul style="background-color: black">在你的组件中应写为<ul style={{ backgroundColor: 'black' }}>

JavaScript 对象和花括号的更多玩法

你可以将多个表达式放入一个对象中,然后在 JSX 的花括号内引用它们:

在这个例子中,personJavaScript 对象包含一个name字符串和一个theme对象:

组件可以像这样使用 person中的值:

JSX 作为一种模板语言非常简洁,因为它允许你使用 JavaScript 来组织数据和逻辑。

回顾

现在你几乎了解了关于 JSX 的一切:

  • 引号内的 JSX 属性作为字符串传递。
  • 花括号让你可以将 JavaScript 逻辑和变量引入到标记中。
  • 它们可以在 JSX 标签内容内部或紧接在属性中的=之后使用。
  • {{}}不是特殊语法:它是一个包裹在 JSX 花括号内的 JavaScript 对象。

尝试一些挑战

Challenge 1 of 3:修复错误 #

这段代码崩溃并报错:Objects are not valid as a React child

你能找出问题所在吗?