Добавить класс css к элементам, сгенерированным циклом на основе записи в массиве объектов - PullRequest
1 голос
/ 06 мая 2019

У меня есть пара объектов для сред (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), чтобы выделить env для любой команды на основе следующего 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"
    }
]; 

, если в redTeams присутствует team и envIndex, я хочу добавить класс в span для этой среды. В команде 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

Некоторые советы по подходу будут полезны и оценены

1 Ответ

2 голосов
/ 06 мая 2019

Вам необходимо условно добавить className при рендеринге.Перед этим вам нужно создать карту для envIndex в env mapping

<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>

Рабочая демонстрация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...