条件渲染
已登录的访客看到一个仪表板,未登录的访客看到登录表单,而失败的请求需要在页面某处显示错误消息。一个像 isLoggedIn 这样的布尔值通常存在于状态中,变化的是根据当前值渲染哪段 UI。JSX 是 JavaScript,所以决定渲染什么和代码中其他决定的工作方式是一样的:在 return 语句中对一个表达式求值,用它来选择一个值。
用三元运算符在两个元素之间选择
当一段 UI 只有两种可能时,用三元运算符来选择:
return (
<div>
{isLoggedIn ? <Dashboard /> : <Login />}
{hasError && <p>Something went wrong</p>}
</div>
)isLoggedIn ? <Dashboard /> : <Login /> 的读法和其他三元运算符一样:如果 isLoggedIn 为真,这个表达式就计算为 <Dashboard />,否则计算为 <Login />。无论它计算为什么,那个值就被渲染在 JSX 中的那个位置。花括号的作用是让你在标记中间插入一个 JavaScript 表达式,三元运算符就是一个普通的表达式。
用 && 显示或隐藏一个元素
第二行处理的是另一种决策形式:显示某样东西,或者什么都不显示。hasError && <p>Something went wrong</p> 用 && 运算符的方式和它在 JavaScript 其他地方的工作方式完全一样。如果 hasError 是 false,&& 会短路,整个表达式计算为 false,根本不会执行右边的 JSX。如果 hasError 是 true,表达式计算为那个 <p> 元素。
这之所以能正确渲染,归结于 React 如何处理结果。React 对 false、null 和 undefined 不渲染任何内容,所以当 hasError 是 false 时,页面上完全不会显示任何东西。
falsy 值的坑
&& 不只会产生 true 或 false。像任何使用 && 的 JavaScript 表达式一样,它计算为落脚的那一侧,那一侧可以是任何值,不一定是布尔值。大多数时候这没问题,但当左侧是数字时就会变成 bug:
{count && <Badge />}
// count = 0 → 在页面上渲染 "0"如果 count 是 0,这个表达式计算为 0。React 对 false、null 和 undefined 不渲染,但 0 是一个真实的、可渲染的值,所以 React 会把它放在页面上。徽章不显示,但一个多余的 0 显示了,就在你期望什么都不显示的地方。
解决办法是确保 && 左侧始终是真正的布尔值:
{count > 0 && <Badge />}
// count = 0 → 什么都不渲染count > 0 总是计算为 true 或 false,所以表达式要么渲染徽章,要么什么都不渲染,没有多余的 0 留下来。
完全不渲染任何东西
有时一个组件没有东西要显示,最清楚的方式就是提前返回:
function Banner({ message }) {
if (!message) {
return null
}
return <p className="banner">{message}</p>
}当 message 为空时,函数在构建 JSX 的其余部分之前就返回了 null。这样做让主 return 专注于有东西要渲染的情况,而不是用一个更多的条件包裹整个 JSX。
&& 显示一个元素或什么都不显示,从一个组件返回 null 是你说"这里没有东西要渲染"的方式。当 count 可能是 0 时要当心 {count && <Badge />},因为 0 是 React 会真正打印的值。改写成 {count > 0 && <Badge />} 能让左侧保持一个真实的布尔值。 接下来:表单,你会用状态来处理输入字段。

