You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中map函数内多条件判断问题:进度条多值配色实现

嘿,我懂你想实现的这个按数值分颜色层级的进度条需求~之前在map里用if/else没生效,大概率是写法或者条件判断的细节出了问题。这里给你几个更优雅的实现方案,尤其是对象映射的方式,比嵌套的if/else清爽太多,后续维护也方便!

方案1:对象映射(最推荐,可维护性拉满)

把数值和对应的颜色类名/样式提前映射成一个对象,直接通过数值取值,代码干净还容易扩展,以后要加新的数值层级也只需要在映射里加一行就行。

先定义映射关系(你可以根据实际需求修改类名或颜色值):

// 假设4种数值对应的进度条颜色类是这四个
const progressColorMap = {
  1: 'progress-bar--danger',
  2: 'progress-bar--warning',
  3: 'progress-bar--info',
  4: 'progress-bar--success'
};

然后在map循环里直接使用:

<ul className="venue-list">
  {searchVenues.map(item => {
    // 替换成你实际存储进度数值的字段
    const progressValue = item.venue.progress;
    // 从映射里取对应的类名,加个默认值防止意外数值
    const progressClass = progressColorMap[progressValue] || 'progress-bar--default';

    return (
      <li className="venue-list__item" key={item.venue.id}>
        <Link to={`/venues/${item.venue.id}`} className="venue-list__itemLink">
          <div className="venue-list__cover" />
          <img src={`${item.venue.imageUrl}`} alt={item.venue.name} />
          {/* 进度条部分 */}
          <div 
            className={`progress-bar ${progressClass}`}
            style={{ width: `${progressValue * 25}%` }} // 假设4级对应100%,按比例计算宽度
          >
            {/* 这里可以加进度数值文本 */}
          </div>
        </Link>
      </li>
    )
  })}
</ul>
方案2:精简版条件判断(适合快速实现)

如果不想用对象映射,也可以把if/else逻辑抽出来写在map函数内部,避免直接嵌套在JSX里导致代码混乱:

<ul className="venue-list">
  {searchVenues.map(item => {
    const progressValue = item.venue.progress;
    let progressClass = '';

    // 这里要注意数值类型匹配,比如如果progressValue是字符串,就要用'1'而不是1
    if (progressValue === 1) {
      progressClass = 'progress-bar--danger';
    } else if (progressValue === 2) {
      progressClass = 'progress-bar--warning';
    } else if (progressValue === 3) {
      progressClass = 'progress-bar--info';
    } else if (progressValue === 4) {
      progressClass = 'progress-bar--success';
    } else {
      progressClass = 'progress-bar--default';
    }

    return (
      <li className="venue-list__item" key={item.venue.id}>
        <Link to={`/venues/${item.venue.id}`} className="venue-list__itemLink">
          <div className="venue-list__cover" />
          <img src={`${item.venue.imageUrl}`} alt={item.venue.name} />
          <div className={`progress-bar ${progressClass}`} style={{ width: `${progressValue * 25}%` }}></div>
        </Link>
      </li>
    )
  })}
</ul>
方案3:内联样式直接设置颜色

如果不想额外写CSS类,也可以直接用内联样式设置背景色,同样用映射来管理:

const progressColorMap = {
  1: '#ff4444',
  2: '#ffbb33',
  3: '#33b5e5',
  4: '#00C851'
};

然后在JSX里:

<div 
  className="progress-bar"
  style={{ 
    width: `${progressValue * 25}%`,
    backgroundColor: progressColorMap[progressValue] || '#cccccc'
  }}
></div>

补充:之前if/else没生效的可能原因

  • 没有把判断逻辑放在map的函数体内,直接写在了JSX的返回语句里,忘记用{}包裹
  • 数值类型不匹配:比如后台返回的是字符串类型的"1",但你用=== 1(数字)判断,导致条件不成立
  • 条件判断的字段写错了,比如取错了item里的进度数值字段

内容的提问来源于stack exchange,提问作者MontyGoldy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:55:16