React-table 单个单元格样式

IT技术 javascript reactjs react-table
2021-05-04 20:38:16

我正在使用 react-table 并希望根据内部的编号更改特定单元格的背景颜色。前任。单元格 > 1 = 绿色,单元格 < 1 = 红色,中间有不同的阴影。我已经看到了大量关于为行和列着色的内容,但我正在努力研究如何根据加载的数据为特定单元格着色。

我知道这段代码不起作用,但希望它会显示我正在寻找的东西:

<ReactTable
  data={data}
  columns={columns}
  getTdProps={(cellInfo) => {
      return {
        if (cellInfo.value > 1) {
            cellInfo.className = "green-cell";
        }
        if (cellInfo.value < 1) {
            cellInfo.className = "red-cell";
        }
      };
    }}
/>

希望这是有道理的。谢谢您的帮助。

3个回答

getTdProps用于整行。getProps改为在列定义中使用例如:

<ReactTable
    data={[
        { age: 8 },
        { age: 11 },
        { age: 9 },
        { age: 6 },
        { age: 12 },
    ]}
    columns={[
        {
            Header: 'Age',
            accessor: 'age',
            getProps: (state, rowInfo, column) => {
                return {
                    style: {
                        background: rowInfo && rowInfo.row.age > 10 ? 'red' : null,
                    },
                };
            },
        }
    ]}
/>

如果您使用的是 v7 react表,请使用getCellProps

  <Table
    columns={[
      {
        Header: "Age",
        accessor: "age"
      }
    ]}
    data={[{ age: 8 }, { age: 11 }, { age: 9 }, { age: 6 }, { age: 12 }]}
    getCellProps={(cellInfo) => ({
      style: {
        backgroundColor: cellInfo.value > 10 ? "red" : null
      }
    })}
  />

https://codesandbox.io/s/magical-yalow-g22yz?file=/src/App.js:2447-2459

我在谷歌上搜索并试图解决这个问题很长一段时间,我能找到的只是关于如何使用样式标签中的三元来做到这一点的解释,提供 1 个值的 2 种颜色选项.. 我猜是因为你可以如果其他 javascript 是 CSS,则不要使用开关。

因此,如果还有其他人试图用任意数量的颜色和任意数量的值来设计 react-tables 的单元格,这是我发现的一种解决方法。现在,举起手来,我是编码新手,这可能比它需要的要复杂得多,而且可能有更好的方法,但我找不到其他任何地方的解释。事实上,我什至发现有人说它不能用 react-table v7 来完成,所以我恢复到 v6,因为我发现了一个带有这个演示的代码沙箱。但是,它使用了 v7 中不再存在的单元格的背景颜色属性,这意味着至少不可能这样做,所以我恢复到 react-table 的 v6,但又回来在 v7 上尝试以下.

所以,这就是我管理它的方式,请让我知道是否有更好的方法,或者这是否有效,但有一种方法可以稍微清理一下!

1 在列中,在要为单元格着色的每一列中创建一个键/值对:functionName

2创建一个新文件并将函数放在那里,创建一个参数为'cell'的函数并将其导出,(它接收单元格对象)

3 将其导入列文件,

4 现在在函数文件中,让它像返回 jsx 的组件一样返回一个 html 输入标签,它基本上是一个......

5 在 input 标签中给它一个类名并将其设置为 className={cell.value}

6 也给它一个值,设置它 value={cell.value}

7 现在使用 CSS 删除输入字段的边框并使其填充表格的单元格,使其看起来像带有颜色的普通单元格

这将为您提供一个充满输入字段的表格,但是您无法编辑它们,因为它们被设置为隐藏在它们下方的 cell.value,并且您可以设置它的样式以使其看起来像使用 CSS 的普通单元格,并且您可以设置它们的类名并使用 css 将它们定位为颜色。我尝试只返回 div,但它们隐藏了您单元格的值,也许您可​​以这样做并在 css 中使用 z-index 但我无法让它工作,CSS 通常不是我的朋友。

如果您希望能够编辑表格单元格,请执行以下操作:

8 把函数做成react组件,在最上面导入useState即可,

9 在组件函数中设置一个名为“something”的状态变量

10 将它的初始值设置为cell.value,现在将className设置为这个变量,

11 现在在 input 标签中创建一个 onChange 侦听器,在其中创建一个带有 'event' 参数的箭头函数并调用 'setSomething' 并将其设置为等于 event.target.value。

12 设置另一个名为 say 'isNewEntry' 的状态变量并将其设置为 false

13 in value 属性现在使用三元;{!isNewEntry ? cell.value : "something"} - 即如果单元格没有被编辑,将值设置为原始值,如果它忽略原始值,现在将其设置为新条目。

我认为这就是它.. 对我有用。就像我说的那样,我可能已经将自己与逻辑联系在一起了,可能有办法让它不那么复杂吗?

函数文件/react组件:

import { useState, useEffect } from 'react'

const InputCell = (cell) => {

const [colorClass, setColorClass] = useState(cell.value)
const [isNewCharacter, setIsNewCharacter] = useState(false)

    return (
            <input 
              className={colorClass} 
              value={!isNewCharacter ? cell.value : colorClass}
              onChange={(event)=>{
                setIsNewCharacter(true)
                setColorClass(event.target.value)
                    }
              }}
            />
         )
       }

export default InputCell

const columns =[
{
    Header: "First Name",
    Footer: "First Name",
    accessor: "first_name",
    Cell: inputCell,
},
{
    Header: "Second Name",
    Footer: "Second Name",
    accessor: "second_name",
    Cell: inputCell,
}]