如何更改所选 ItemList Material-Ui 的背景颜色

How to change background color of a selected ItemList Material-Ui

我使用 Material-UI

创建了一个可选组件
let SelectableInfiniteList = makeSelectable(Infinite);

并将 ListItem 放入其中,现在我想更改所选项目的默认灰色,但我不知道如何,如果我给它一个 className

<ListItem className="list-item" primaryText={i}/>

并使用 list-item:focus 选择器我可以更改背景颜色,只要它被聚焦(但如果我单击应用程序中的其他地方)焦点丢失并且灰色显示在(仍然) 所选项目,

有没有办法改变所选项目的背景颜色?

在您的高阶组件中添加新的 属性 selectedItemStyle!

<ComposedComponent selectedItemStyle={selectedItemStyle} value={this.state.selectedIndex} onChange={this.handleRequestChange} containerHeight={this.props.containerHeight} elementHeight={40}>
   {this.props.children}
</ComposedComponent>

其中 selectedItemStyle 是

const slectedItemStyle = {
 backgroundColor: 'red'
}

通过像这样传递 selected 样式来更改默认选择的灰色。

<ListItem
        button
        selected={true}
        classes={{ selected: classes.active }}>
  <ListItemText primary={item.name} />
</ListItem>

样式对象应该是这样的。

active: {
  backgroundColor: "red"
}

我不得不使用全局主题覆盖:https://material-ui.com/customization/components/#global-theme-override

const muiTheme = createMuiTheme({
  overrides: {
    MuiListItem: {
      root: {
        "&$selected": {
          backgroundColor: "red",
          "&:hover": {
            backgroundColor: "orange",
          },
        },
      },
      button: {
        "&:hover": {
          backgroundColor: "yellow",
        },
      },
    },
  },
});

如果您对无需全局覆盖样式的方法感兴趣,

import clsx from 'clsx';
import { makeStyles } from '@material-ui/core/styles';

const useStyles = makeStyles({
  root: {
    '&$selected': {
      backgroundColor: 'red',
      '&:hover': {
        backgroundColor: 'yellow',
      }
    },
  },
  selected: {},
});

const CustomSelectedListItem = (
  <ListItem
    button
    classes={{ root: classes.root, selected: classes.selected }}
    selected
  >
    <ListItemText primary="List Item" />
  </ListItem>
);

Codesandbox. Material-UI docs.

如果您更喜欢本地自定义样式,可以通过classes (https://material-ui.com/customization/components/#overriding-styles-with-classes)

覆盖material-ui的组件样式
...
selected    .Mui-selected   Pseudo-class applied to the root element if selected={true}.
...

The rule name we would override is: selected
  • 根据需要创建自定义样式
// For example
const useStyles = makeStyles((theme) => ({
  listItemSelected: {
    color: 'red',
  },
}));
  • 覆盖 ListItemclasses
// Override rule "selected" by "listItemSelected"
<ListItem classes={{selected: listItemSelected}}>
  <ListItemText primary={"Hi"} />
</ListItem>

如果你想为它覆盖全局样式,请按照:

使用 Material UI v4 这对我有用:

<ListItem button classes={{ root: classes.listItemRoot }}>
  ...
</ListItem>

与:

const useStyles = makeStyles((theme) => ({
  listItemRoot: {
    "&.Mui-selected": {
        backgroundColor: 'red',
    }
  },
}));

const theme = createTheme({
  components: {
    MuiListItem: {
      styleOverrides: {
        root: {
          backgroundColor: 'blue',

          '&.Mui-selected': {
            backgroundColor: 'red',
          },
        },
      },
    },
  },
});