首页 / React 19 入门教程 / 条件渲染

React 19 入门教程

条件渲染

本教程共 50 篇 · 第 10 篇 · 更新于 2026-07-29 · 约 7 分钟阅读

React条件渲染if三元表达式逻辑与短路运算

10. 条件渲染

本节目标:掌握四种条件渲染的写法,理解它们的适用场景,避开 && 左侧是数字的坑。

核心思路

React 的条件渲染就是 JavaScript 的条件逻辑。没有 v-ifv-show 这种特殊语法,直接用 if?:&&

方法一:if/else

最基本的条件判断,在组件内部控制返回什么:

function Item({ name, isPacked }) {
  if (isPacked) {
    return <li>{name} ✅</li>;
  }
  return <li>{name}</li>;
}

isPackedtrue 时返回带勾选的版本,否则返回普通版本。

Tip

if/else 最直观,适合分支逻辑复杂的场景。

方法二:三元表达式 ? :

当你想在 JSX 内部做条件判断时,三元更紧凑:

function Item({ name, isPacked }) {
  return (
    <li>
      {isPacked ? name + ' ✅' : name}
    </li>
  );
}

读作:“如果 isPacked 为真,渲染 name + ' ✅',否则渲染 name”。

三元也可以嵌套,但别超过两层:

// 勉强能读
<div>
  {status === 'loading' ? <Spinner /> :
   status === 'error' ? <Error /> :
   <Content />}
</div>

// 太复杂了,不如用 if/else 或提取成子组件

方法三:逻辑与 &&

当条件为真时渲染,为假时什么都不渲染:

function Item({ name, isPacked }) {
  return (
    <li>
      {name} {isPacked && '✅'}
    </li>
  );
}

读作:“如果 isPacked 为真,渲染 '✅',否则不渲染”。

Warning

切勿把数字放在 && 左侧!

// 错误:messageCount 为 0 时会渲染数字 0
{messageCount && <p>新消息</p>}

// 正确:先转成布尔值
{messageCount > 0 && <p>新消息</p>}

0 && <p> 的结果是 0,React 会渲染 0

方法四:变量赋值

当逻辑比较复杂时,用变量保存 JSX:

function Item({ name, isPacked }) {
  let content = name;
  if (isPacked) {
    content = <del>{name} ✅</del>;
  }
  return <li>{content}</li>;
}

这种方式最灵活,也最容易维护。

返回 null 隐藏组件

如果你希望某个组件完全不渲染,可以返回 null

function Warning({ show }) {
  if (!show) {
    return null;
  }
  return <div className="warning">警告信息</div>;
}
// 使用
<Warning show={false} />  // 什么都不渲染
<Warning show={true} />   // 渲染警告
Note

返回 null 不会触发组件的状态重置。组件只是不显示,但还”活着”。

四种方法怎么选

方法适用场景
if/else分支逻辑复杂,或需要提前返回
? :JSX 内部的二选一
&&条件为真时渲染,为假时不渲染
变量赋值逻辑复杂,需要多次判断

实战示例:登录状态

function LoginButton({ isLoggedIn, onLogin, onLogout }) {
  if (isLoggedIn) {
    return <button onClick={onLogout}>退出</button>;
  }
  return <button onClick={onLogin}>登录</button>;
}

// 或者用三元
function LoginButton({ isLoggedIn, onLogin, onLogout }) {
  return (
    <button onClick={isLoggedIn ? onLogout : onLogin}>
      {isLoggedIn ? '退出' : '登录'}
    </button>
  );
}

// 或者用 && 组合
function ToolBar({ isLoggedIn }) {
  return (
    <div>
      <HomeLink />
      <AboutLink />
      {isLoggedIn && <DashboardLink />}
      {isLoggedIn && <LogoutButton />}
    </div>
  );
}

常见错误

错误 1:&& 左侧是数字

// 错误
{count && <p>有 {count} 条消息</p>}

// 修复
{count > 0 && <p>有 {count} 条消息</p>}

错误 2:三元的两边类型不一致

// 不推荐:一边是字符串,一边是 JSX
{isLoggedIn ? '已登录' : <LoginForm />}

// 推荐:两边都是 JSX
{isLoggedIn ? <span>已登录</span> : <LoginForm />}

错误 3:嵌套三元太深

// 难读
{x ? <A /> : y ? <B /> : z ? <C /> : <D />}

// 改用 if/else 或 switch
let content;
if (x) {
  content = <A />;
} else if (y) {
  content = <B />;
} else if (z) {
  content = <C />;
} else {
  content = <D />;
}

本节小结

  • React 条件渲染用 JavaScript 原生语法
  • if/else 适合复杂分支,? : 适合二选一,&& 适合”有则显示”
  • && 左侧不能是数字,否则会渲染数字
  • 返回 null 可以隐藏组件

下一节学列表渲染。