组件经常需要根据不同条件显示不同内容。在React中,你可以使用类似于if语句、&&和?:运算符的JavaScript语法有条件地呈现JSX。
你将学到:
如何根据条件返回不同的JSX
如何有条件地包含或排除一段JSX
在React代码库中常见的条件语法快捷方式
假设你有一个PackingList组件,渲染多个项目,这些项目可以标记为已打包或未打包:
function Item({ name, isPacked }) {
return {name} ;
}
export default function PackingList() {
return (
Sally Ride's Packing List
);
}
注意到一些Item组件的isPacked属性被设置为true,而不是false。如果isPacked={true},你想在已打包的项目中添加一个勾号(✔)。
你可以使用if/else语句编写如下:
if (isPacked) {
return {name} ✔ ;
}
return {name} ;
如果isPacked属性为true,则该代码返回一个不同的JSX树。通过这个更改,一些项目在末尾会显示一个勾号:
function Item({ name, isPacked }) {
if (isPacked) {
return {name} ✔ ;
}
return {name} ;
}
export default function PackingList() {
return (
Sally Ride's Packing List
);
}
尝试编辑返回值,观察结果的变化!
注意到你正在使用JavaScript的if和return语句来创建分支逻辑。在React中,控制流(如条件)是由JavaScript处理的。
在某些情况下,你可能不想渲染任何东西。例如,假设你根本不想显示已打包的项目。一个组件必须返回一些内容。在这种情况下,你可以返回null:
if (isPacked) {
return null;
}
return {name} ;
如果isPacked为true,该组件将返回空值null,否则,它将返回用于渲染的JSX。
function Item({ name, isPacked }) {
if (isPacked) {
return null;
}
return {name} ;
}
export default function PackingList() {
return (
Sally Ride's Packing List
);
}
实际上,在组件中返回null并不常见,因为它可能会让尝试渲染它的开发人员感到惊讶。通常,你会有条件地在父组件的JSX中包含或排除该组件。以下是如何实现这一点!
在前面的示例中,你控制了组件将返回哪个(如果有的话!)JSX树。你可能已经注意到了渲染输出中的一些重复:
{name} ✔
和下面这段代码非常相似:
{name}
两个条件分支都返回
:
if (isPacked) {
return {name} ✔ ;
}
return {name} ;
虽然这种重复没有害处,但它可能会使你的代码更难维护。如果你想要改变className会怎么样呢?你必须在代码中的两个地方进行更改!在这种情况下,你可以有条件地包含一些JSX,使你的代码更加DRY。
JavaScript有一种紧凑的语法来编写条件表达式 - 条件运算符或“三目运算符”。
你可以用它来代替:
if (isPacked) {
return {name} ✔ ;
}
return {name} ;
可以写成这样:
return (
{isPacked ? name + ' ✔' : name}
);
可以将其理解为“如果isPacked为true,则(?)呈现name+'✔',否则(:)呈现name”。
现在假设你想要将完成的条目文本包装在另一个HTML标记中,例如
来划掉它。你可以添加更多的换行符和括号,这样就可以更容易地嵌套更多的JSX在每个情况下:
function Item({ name, isPacked }) {
return (
{isPacked ? (
{name + ' ✔'}
) : (
name
)}
);
}
export default function PackingList() {
return (
Sally Ride's Packing List
);
}
这种方式适用于简单的条件,但是要适度使用。如果你的组件具有太多嵌套的条件标记而变得混乱,请考虑提取子组件以清理代码。在React中,标记是代码的一部分,因此您可以使用变量和函数等工具来整理复杂的表达式。
你会遇到的另一个常用的快捷方式是JavaScript的逻辑与(&&)运算符。在React组件中,当您希望在条件为真时呈现一些JSX,否则不呈现任何东西时,它经常出现。使用&&,您可以仅在isPacked为true时有条件地呈现复选标记:
return (
{name} {isPacked && '✔'}
);
你可以理解为“如果isPacked为真,则(&&)渲染勾号,否则不渲染任何东西”。
下面是它的实现:
function Item({ name, isPacked }) {
return (
{name} {isPacked && '✔'}
);
}
export default function PackingList() {
return (
Sally Ride's Packing List
);
}
当 JavaScript 的 && 表达式左侧(我们的条件)为 true 时,它返回右侧的值(在我们的示例中,是打勾符号)。但如果条件为 false,整个表达式将变为 false。React 将 false 视为 JSX 树中的“空洞”,就像 null 或 undefined 一样,并在其位置上不呈现任何内容。
陷阱:不要将数字放在 && 的左侧。
为了测试条件,JavaScript 会自动将左侧转换为布尔值。但是,如果左侧是 0,则整个表达式得到的值就是 0,而 React 将愉快地呈现 0 而不是什么都不呈现。
例如,常见的错误是编写类似 New messagesmessageCount &&
的代码。很容易假设当 messageCount 为 0 时,它什么也不呈现,但它实际上会呈现 0 本身!
要修复它,请将左侧设置为布尔值: New messagesmessageCount > 0 &&
。
当快捷方式妨碍编写普通代码时,请尝试使用 if 语句和变量。您可以使用 let 定义的变量进行重新赋值,因此首先提供您要显示的默认内容,即名称:
let itemContent = name;
使用 if 语句将 JSX 表达式重新分配给 itemContent(如果 isPacked 为 true):
if (isPacked) {
itemContent = name + " ✔";
}
花括号打开了“JavaScript 的窗口”。使用花括号嵌套先前计算出的表达式,将变量嵌入返回的 JSX 树中:
{itemContent}
这种风格最冗长,但也是最灵活的。以下是实例:
function Item({ name, isPacked }) {
let itemContent = name;
if (isPacked) {
itemContent = name + " ✔";
}
return (
{itemContent}
);
}
export default function PackingList() {
return (
Sally Ride's Packing List
);
}
与之前一样,这不仅适用于文本,还适用于任意的 JSX。
function Item({ name, isPacked }) {
let itemContent = name;
if (isPacked) {
itemContent = (
{name + " ✔"}
);
}
return (
{itemContent}
);
}
export default function PackingList() {
return (
Sally Ride's Packing List
);
}
如果您不熟悉 JavaScript,这些样式的多样性可能会一开始让您感到不知所措。然而,学习它们将有助于您阅读和编写任何 JavaScript 代码,而不仅仅是 React 组件!首先选择您喜欢的风格,如果您忘记了其他风格的工作方式,请再次参考此参考文献。
在 React 中,您可以使用 JavaScript 控制分支逻辑。
你可以使用 if 语句有条件地返回 JSX 表达式。
你可以使用花括号将一些 JSX 有条件地保存到变量中,然后在 JSX 中包含它。
快捷方式很常见,但如果您喜欢普通 if,则不必使用它们。
长按关注
帮助 10W 人入门并进阶前端