【问题标题】:Add css class to elements generated by loop based on entry in array of objects根据对象数组中的条目将css类添加到循环生成的元素中
【发布时间】:2019-05-06 05:54:17
【问题描述】:

我有几个用于环境 (envList) 和团队 (teamsList) 的对象,如下所示:

const envList = {
    dev: "DEV",
    sit: "SIT",
    uat: "UAT",
    qa: "QA",
    prod: "PROD"
  };

  const teamsList = {
    a: "Team A",
    b: "Team B",
    c: "Team C",
    d: "Team D"
  };

我正在循环它们以将它们显示为(某种)表格:

<div className="App">
      {Object.keys(teamsList).map((key, i) => (
        <div className="team" key={i}>
          <span className="teamname">{teamsList[key]}</span>
          {Object.keys(envList).map((key, i) => (
            <span className="env-th-cell" key={key}>
              {envList[key]}
            </span>
          ))}
        </div>
      ))}
</div> 

注意:以上是 JSX,但并不是真正的 React 问题。只是在团队和环境中嵌套地图。

生成输出,如

Team A DEV SIT UAT QA PROD
Team B DEV SIT UAT QA PROD
Team C DEV SIT UAT QA PROD
Team D DEV SIT UAT QA PROD

我需要添加一个 CSS 类 (.red) 以突出显示基于以下 redTeams 数组的任何团队的环境:

const redTeams = [
    {
      envIndex: 0,
      team: "Team A"
    },
    {
      envIndex: 0,
      team: "Team B"
    },
    {
      envIndex: 4,
      team: "Team B"
    }
    {
      envIndex: 3,
      team: "Team C"
    },
    {
      envIndex: 4,
      team: "Team C"
    }
]; 

如果teamenvIndex 存在于redTeams 中,我想在该环境的跨度上添加一个类。 redTeams 中的一个团队可能有多个条目。

Team A DEV(red) SIT UAT QA      PROD
Team B DEV(red) SIT UAT QA      PROD (red)
Team C DEV      SIT UAT QA(red) PROD
Team D DEV      SIT UAT QA      PROD(red)

上面的输出是为了表示,没有(红色),而是在span中添加了一个类

这是一个沙盒https://codesandbox.io/s/pwjxy82j5x?fontsize=14

有关该方法的一些建议会有所帮助和赞赏

【问题讨论】:

    标签: javascript reactjs loops ecmascript-6


    【解决方案1】:

    渲染时需要有条件地添加className。在此之前,您需要为 envIndex 到 env 映射创建一个映射

    <div className="App">
      {Object.keys(teamsList).map((key, i) => {
        const teams = redTeams.filter(team => teamsList[key] === team.team);
        return (
          <div className="team" key={i}>
            <span className="teamname">{teamsList[key]}</span>
            {Object.keys(envList).map((key, i) => {
              let className = "env-th-cell";
              if (
                teams &&
                teams.findIndex(
                  t => envList[key] === indexToEnvMap[t.envIndex]
                ) > -1
              ) {
                className += " red";
              }
              return (
                <span className={className} key={key}>
                  {envList[key]}
                </span>
              );
            })}
          </div>
        );
      })}
    </div>
    

    Working demo

    【讨论】:

    • 是的,这行得通……几乎!除非redTeams 数组中有特定团队的两个条目。例如 Team BenvIndex 0 和 4 的条目,例如 ``` const redTeams = [ { envIndex: 0, team: "Team A" }, { envIndex: 0, team: "Team B" }, { envIndex:4,团队:“团队 B”},{ envIndex:3,团队:“团队 C”},{ envIndex:4,团队:“团队 D”}]; ``` codesandbox.io/s/4r7wqk96x 这不会将类添加到团队 B 的 env 4 (PROD) 中
    • @Smarajit Updater 我的答案是使用 filter 而不是 find。
    • 没有收到您的问题,请查看演示链接。
    猜你喜欢
    • 1970-01-01
    • 2016-10-20
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    相关资源
    最近更新 更多