Как изменить цвет строки таблицы в зависимости от значения свойства объекта?

#javascript #arrays #reactjs

Вопрос:

У меня есть массив объектов, выводимых из API, как показано ниже:

 var x = [{
    name: "test",
    group: [{
      name: "rating",
      value: "55"
    }]
  },
  {
    name: "test1",
    group: [{
      name: "rating",
      value: "20"
    }]
  },
  {
    name: "test2",
    group: [{
      name: "rating",
      value: "60"
    }]
  },
  {
    name: "test3",
    group: [{
      name: "rating",
      value: "10"
    }]
  }
] 
 <table>
  <tr>
    <td>test</td>
    <td>test1</td>
    <td>test2</td>
    <td>test3</td>
  </tr>
</table> 

Я пытаюсь изменить цвет всех строк таблицы на зеленый в зависимости от значения объекта x.group[0].value , превышающего 30. Есть идеи, как я могу этого добиться? Я пытаюсь сгруппировать массивы со значениями, превышающими 30, но я не уверен, как я могу изменить цвет на основе этого.

 for (var i = 0; i < x.length; i  ) {
  x[i].group[0].value
} 

Примечание: Я использую ReactJS. Я создал компонент таблицы, подобный этому. Я не уверен, что смогу сильно изменить HTML

Ответ №1:

Вы можете использовать условие, чтобы определить, больше или нет x.group[0].value 30

 <table>
    <tr style={{backgroundColor: !!(x.group[0].value > 30) ? 'green': 'red'}}>test</tr>
    <tr style={{backgroundColor: !!(x.group[0].value > 30) ? 'green': 'red'}}>test1</tr>
    <tr style={{backgroundColor: !!(x.group[0].value > 30) ? 'green': 'red'}}>test2</tr>
    <tr style={{backgroundColor: !!(x.group[0].value > 30) ? 'green': 'red'}}>test3</tr>
</table>
 

Добавление этой строки style={{ backgroundColor: !!true ? "green" : "red" }} в строку 101 внутри тега в примере кода делает строки таблицы зелеными. Измените условие, чтобы использовать ваше значение, и оно будет зеленым/вашим цветом в зависимости от условия

Ответ №2:

Вы можете использовать clsx библиотеку, с помощью которой вы можете предоставить несколько className s условно.

 <tr
  className={clsx({
    defaultClass: true,
    tableGreen: x.group[0].value > 30,
    // other conditional classes
  })}
>
  ...
</tr>
 

В вашем styles.css

 .defaultClass {
  padding: 5px;
}

.tableGreen {
  backgroundColor: #00ff00;
}

 

Чтобы он работал с react-table вами, вам придется изменить структуру массива

 function transform(y) {
  return y.map((i) => ({
    name: i.name,
    ...i.group.reduce((acc, curr) => ({ ...acc, [curr.name]: curr.value }), {}),
  }));
}
 

Это даст вам такой результат

 [
    {
        "name": "test",
        "rating": "55"
    },
    {
        "name": "test1",
        "rating": "20"
    },
    {
        "name": "test2",
        "rating": "60"
    },
    {
        "name": "test3",
        "rating": "10"
    }
]
 

При сравнении обязательно преобразуйте rating в number тип с помощью parseInt . В конечном итоге в Table компоненте, как в приведенном вами примере.

 <tbody {...getTableBodyProps()}>
  {page.map((row, i) => {
    prepareRow(row);
    return (
      <tr
        {...row.getRowProps()}
        className={clsx({
          defaultClass: true,
          tableGreen: parseInt(row.original.rating) > 30,
          // other conditional classes
        })}
      >
        {row.cells.map((cell) => {
          return <td {...cell.getCellProps()}>{cell.render("Cell")}</td>;
        })}
      </tr>
    );
  })}
</tbody>