每日壁纸

React 条件渲染最佳实践

Published on
/5 mins read/---

问题描述

在 React 中使用 && 操作符进行条件渲染时,如果左侧条件为数字 0,会渲染出 0 而不是什么都不显示。

常见陷阱

❌ 错误写法

// 当 count 为 0 时,会渲染出 "0"
{
  count && <div>{count} 个项目</div>
}
 
// 当 readTime 为 0 时,会渲染出 "0"
{
  readTime && <div>阅读时间:{readTime} 分钟</div>
}
 
// 当 array.length 为 0 时,会渲染出 "0"
{
  array.length && <div>共有 {array.length}</div>
}

✅ 正确写法

方法 1:使用双重否定 !!

{
  !!count && <div>{count} 个项目</div>
}
{
  !!readTime && <div>阅读时间:{readTime} 分钟</div>
}
{
  !!array.length && <div>共有 {array.length}</div>
}

方法 2:显式比较

{
  count > 0 && <div>{count} 个项目</div>
}
{
  readTime > 0 && <div>阅读时间:{readTime} 分钟</div>
}
{
  array.length > 0 && <div>共有 {array.length}</div>
}

方法 3:使用三元操作符

{
  count > 0 ? <div>{count} 个项目</div> : null
}
{
  readTime > 0 ? <div>阅读时间:{readTime} 分钟</div> : null
}
{
  array.length > 0 ? <div>共有 {array.length}</div> : null
}

方法 4:使用 Boolean() 转换

{
  Boolean(count) && <div>{count} 个项目</div>
}
{
  Boolean(readTime) && <div>阅读时间:{readTime} 分钟</div>
}
{
  Boolean(array.length) && <div>共有 {array.length}</div>
}

为什么会出现这个问题?

JavaScript 的 && 操作符返回第一个假值或最后一个真值:

// 返回 0(假值)
0 && 'hello' // 结果:0
 
// 返回 "hello"(真值)
1 && 'hello' // 结果:"hello"
 
// 返回 false(假值)
false && 'hello' // 结果:false
 
// 返回 null(假值)
null && 'hello' // 结果:null

在 React 中:

  • falsenullundefined 不会被渲染
  • 但是 0 会被渲染为字符串 "0"

推荐的解决方案

对于数字类型

// 推荐:显式比较
{
  count > 0 && <Component />
}
{
  readTime > 0 && <Component />
}
 
// 或者:双重否定(适用于任何假值)
{
  !!count && <Component />
}

对于数组长度

// 推荐:显式比较
{
  items.length > 0 && <Component />
}
 
// 或者:检查数组本身
{
  items && items.length > 0 && <Component />
}

对于字符串

// 推荐:检查非空字符串
{
  text && text.trim() && <Component />
}
 
// 或者:显式比较
{
  text && text.length > 0 && <Component />
}

对于对象

// 推荐:检查对象存在
{
  user && <Component />
}
 
// 或者:检查特定属性
{
  user && user.name && <Component />
}

项目中的应用示例

阅读时间显示

// ❌ 错误:readTime 为 0 时显示 "0"
{
  readTime && <div>预计阅读时间:{readTime} 分钟</div>
}
 
// ✅ 正确:readTime 为 0 时不显示
{
  readTime > 0 && <div>预计阅读时间:{readTime} 分钟</div>
}

课程进度显示

// ❌ 错误:progress 为 0 时显示 "0"
{
  progress && <Progress percent={progress} />
}
 
// ✅ 正确:progress 为 0 时也要显示(因为 0% 是有意义的)
{
  progress >= 0 && <Progress percent={progress} />
}

列表项计数

// ❌ 错误:count 为 0 时显示 "0"
{
  count && <div>{count}</div>
}
 
// ✅ 正确:count 为 0 时不显示
{
  count > 0 && <div>{count}</div>
}

检查清单

在编写条件渲染时,问自己:

  1. 左侧条件可能为 0 吗? 如果是,使用 > 0!!
  2. 0 是否有意义? 如果 0 是有效值(如进度 0%),使用 >= 0
  3. 是否需要检查多个条件? 考虑使用三元操作符或提取到函数中

团队约定

  1. 数字条件:优先使用显式比较(> 0>= 0
  2. 布尔条件:可以直接使用 &&
  3. 复杂条件:提取到函数或使用三元操作符
  4. 代码审查:重点检查数字类型的条件渲染

相关工具

ESLint 规则

可以配置 ESLint 规则来检测这类问题:

{
  "rules": {
    "react/jsx-no-leaked-render": "error"
  }
}

这个规则会警告可能导致意外渲染的条件表达式。

Happy coding with AI!