ReactJS + Material-UI:如何在 Material-UI <Table/> 的 <TableRow/> 之间交替颜色?

Posted

技术标签:

【中文标题】ReactJS + Material-UI:如何在 Material-UI <Table/> 的 <TableRow/> 之间交替颜色?【英文标题】:ReactJS + Material-UI: How to alternate colors between Material-UI <Table/>'s <TableRow/>? 【发布时间】:2017-02-07 11:08:03 【问题描述】:

我目前有一个 Material-UI 的 &lt;Table/&gt; ( http://www.material-ui.com/#/components/table ),并且希望每一行在蓝色和紫色之间切换。所以第一个是蓝色的,然后下一行是紫色的,依此类推,添加任何额外的行。

如何为添加的任何其他行动态关闭两种颜色?

render()

    return(
        <Table
          multiSelectable=true
        >
          <TableHeader>
            <TableRow>
              <TableHeaderColumn>First Name</TableHeaderColumn>
              <TableHeaderColumn>Last Name</TableHeaderColumn>
              <TableHeaderColumn>Color</TableHeaderColumn>
            </TableRow>
          </TableHeader>
          <TableBody
            displayRowCheckbox=true
            stripedRows
          >
              <TableRow>
                <TableRowColumn>John</TableRowColumn>
                <TableRowColumn>Smith</TableRowColumn>
                <TableRowColumn>Red</TableRowColumn>
              </TableRow>
              <TableRow>
                <TableRowColumn>Paul</TableRowColumn>
                <TableRowColumn>Row</TableRowColumn>
                <TableRowColumn>Black</TableRowColumn>
              </TableRow>
              <TableRow>
                <TableRowColumn>Doe</TableRowColumn>
                <TableRowColumn>Boe</TableRowColumn>
                <TableRowColumn>Pink</TableRowColumn>
              </TableRow>
              <TableRow>
                <TableRowColumn>Frank</TableRowColumn>
                <TableRowColumn>Done</TableRowColumn>
                <TableRowColumn>White</TableRowColumn>
              </TableRow>
              <TableRow>
                <TableRowColumn>Lucy</TableRowColumn>
                <TableRowColumn>Ju</TableRowColumn>
                <TableRowColumn>Orange</TableRowColumn>
              </TableRow>
          </TableBody>
        </Table>

提前谢谢你

【问题讨论】:

github.com/callemall/material-ui#customization 【参考方案1】:

您可以使用 &lt;TableBody&gt; 组件的 stripedRows 属性来对行进行视觉分隔,但我不确定您是否可以为此选项自定义颜色。

<TableBody stripedRows > </TableBody>

或者您可以通过为&lt;TableBody&gt; 组件设置className 来实现它,并使用css even and odd rules 设置颜色。或许,您还应该为这些规则设置 !important 以覆盖内联样式。

【讨论】:

在我接受答案并点赞之前,您知道是否可以使用stripedRows 更改颜色吗?因为这是最好的方法,并尝试搜索它,但定制没有运气...... 我没有找到办法做到这一点。您可以尝试自定义主题,但我认为并非如此,因为颜色会随处更改。我还在 github 上打开了一个问题,与维护人员讨论这种情况。您无法追踪它,因为我可能是错的并且有解决方案。 github.com/callemall/material-ui/issues/5286 非常感谢!会留意的。最后一个问题,在选中一个复选框后,有没有办法摆脱行突出显示? 不确定我是否理解正确。你的意思是取消所有行的条带属性还是只取消一个? 在 2016 年到 2019 年之间的某个时候,这种情况发生了变化,“stripedRows”不再可用。相反,您可以执行类似的操作:rows.map((row, index) =&gt; ( &lt;TableRow key=row.percent className=index%2 ? classes.lightRow : classes.darkRow&gt; ))【参考方案2】:

我有点晚了,但由于某种原因stripedRows 对我不起作用,这就是我这样做的原因:

只需使用模运算符在 2 种颜色之间切换

this.state.data.map((row)=> (
 <TableRow style = row.rank % 2?  background : "#fdffe0" : background : "white" > 
...
</TableRow>
))

@版本 4.2.1

【讨论】:

【参考方案3】:

试试这个。这在@version 4.4.2 中运行良好


this.state.data.map((row,index)=> (
 <TableRow style = index % 2?  background : "#fdffe0" : background : "white" > 
...
</TableRow>
))

希望这会对您有所帮助。快乐编码...!

【讨论】:

【参考方案4】:

您可以使用withStyles 创建样式TableRow 并应用even and odd css rules。


使用 Typescript:

const StyledTableRow = withStyles((theme: Theme) =>
  createStyles(
    root: 
      '&:nth-of-type(odd)': 
        backgroundColor: "white",
      ,
      '&:nth-of-type(even)': 
        backgroundColor: "grey",
      ,
    ,
  ),
)(TableRow);

使用 Javascript:

const StyledTableRow = withStyles((theme) => (
  root: 
    '&:nth-of-type(odd)': 
      backgroundColor: "white",
    ,
    '&:nth-of-type(even)': 
      backgroundColor: "grey",
    ,
  ,
))(TableRow);

使用你的例子,它应该是这样的:

render()
  return(
    <Table multiSelectable=true >
      <TableHeader>
        <TableRow>
          ...
        </TableRow>
      </TableHeader>
      <!-- stripedRows is no longer available in the newer versions of MUI -->
      <TableBody displayRowCheckbox=true >
        <StyledTableRow>
          ...
        </StyledTableRow>
...

这就是 Material-UI 在其docs 中的奇/偶行样式。

您可以在这个 CodeSandbox 示例中看到它的工作原理。

【讨论】:

这是正确的答案。给这个人一万美元

以上是关于ReactJS + Material-UI:如何在 Material-UI <Table/> 的 <TableRow/> 之间交替颜色?的主要内容,如果未能解决你的问题,请参考以下文章

ReactJS + Material-UI:如何在 Material-UI <Table/> 的 <TableRow/> 之间交替颜色?

ReactJS + Material-UI:如何减小 Material-UI 的 <TableRow/> 的列宽?

ReactJS + Material-UI:如何使用 Material-UI 的 <DatePicker> 将当前日期设置为默认值?

数据变化时如何在ReactJS中刷新Material-Table(Material-ui)组件

如何结合 ReactJs Router Link 和 material-ui 组件(如按钮)?

ReactJS with Material-UI:如何按字母顺序对 Material-UI 的 <TableRow> 数组进行排序?