条件渲染
已登录的用户看到仪表板,未登录的用户看到登录表单,请求失败时需要在页面某处显示错误信息。像 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 时,页面上什么都不会显示。
假值陷阱
&& 不仅仅产生 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 能专注于确实有东西要渲染的情况,而不是把整个东西包裹在又一层条件中。
&& 显示一个元素或什么都不显示,从组件中返回 null 是表达"这里没有东西要渲染"的方式。 当 count 可能是 0 时,要小心 {count && <Badge />},因为 0 是 React 会真正打印的值。改写成 {count > 0 && <Badge />} 能保持左侧是真正的布尔值。
接下来:表单,你将用状态来处理输入字段。

