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

如何在React Map操作中去除重复联赛ID,实现单联赛头部展示

解决同一联赛重复渲染LeagueHeader的问题

问题核心是你把LeagueHeader放在了单场赛事的MatchMonthCard组件里,导致每个赛事卡片都带一个联赛头部。正确的做法是按联赛分组遍历,每个分组只渲染一次头部,再在头部下方渲染该联赛的所有赛事卡片。

具体实现步骤

假设你已经通过groupBy得到了按联赛ID分组的数据:const groupedMatches = groupBy(matches, 'leagueId'),结构为{ [leagueId]: [match1, match2, ...] }

1. 调整渲染层级,把LeagueHeader提到分组外层

原来的错误写法(每个赛事卡片都带头部):

Object.entries(groupedMatches).map(([leagueId, matches]) => {
  return matches.map(match => (
    // MatchMonthCard内部包含LeagueHeader,导致重复渲染
    <MatchMonthCard key={match.id} match={match} />
  ))
})

修正后的写法(每个联赛只渲染一次头部):

Object.entries(groupedMatches).map(([leagueId, matches]) => {
  // 从该联赛的任意一场赛事中获取联赛信息(或从单独的联赛数据中匹配)
  const leagueInfo = matches[0].league;
  
  return (
    <div key={leagueId} className="league-container">
      {/* 每个联赛仅渲染一次头部 */}
      <LeagueHeader league={leagueInfo} />
      {/* 遍历该联赛下的所有赛事,渲染不带头部的赛事卡片 */}
      {matches.map(match => (
        <MatchMonthCard key={match.id} match={match} />
      ))}
    </div>
  )
})

2. 剥离MatchMonthCard中的LeagueHeader

修改MatchMonthCard组件,移除内部的LeagueHeader逻辑,让它只负责渲染单场赛事的内容,职责更清晰:

// MatchMonthCard.jsx
const MatchMonthCard = ({ match }) => {
  return (
    <div className="match-card">
      {/* 只保留单场赛事的信息:日期、对阵、比分等 */}
      <div>{match.date}</div>
      <div>{match.homeTeam} vs {match.awayTeam}</div>
      {/* ...其他赛事内容 */}
    </div>
  )
}

3. 优化:从单独的联赛数据中匹配信息(可选)

如果你的赛事数据里没有完整的联赛信息,而是有单独的联赛列表,可以通过联赛ID精准匹配:

// 假设你有独立的联赛数据数组
const leagueList = [
  { id: 1, name: "英超", logo: "xxx.png" },
  { id: 2, name: "西甲", logo: "yyy.png" }
]

Object.entries(groupedMatches).map(([leagueId, matches]) => {
  const leagueInfo = leagueList.find(league => league.id === parseInt(leagueId));
  if (!leagueInfo) return null; // 找不到对应联赛时跳过渲染

  return (
    <div key={leagueId} className="league-container">
      <LeagueHeader league={leagueInfo} />
      {matches.map(match => (
        <MatchMonthCard key={match.id} match={match} />
      ))}
    </div>
  )
})

额外注意事项

  • 确保key的唯一性:外层容器用leagueId,赛事卡片用match.id,避免React渲染警告
  • 可以添加空数据判断:如果某个联赛下没有赛事,直接跳过该分组的渲染
  • 保持组件职责单一:头部组件负责联赛信息展示,赛事卡片负责单场赛事展示,后续维护更方便

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:01:06