【问题标题】:Material UI and ReactJS, how to style a selected ListItem using withStyles?Material UI 和 ReactJS,如何使用 withStyles 为选定的 ListItem 设置样式?
【发布时间】:2021-01-06 10:34:23
【问题描述】:

我想更改所选ListItem 的样式,如this codesandbox 所示。
在沙箱中,我使用全局 CSS 样式表,但我想使用 withStyle technique
我该怎么做?
我应该使用什么className 来定位selected ListItem?

【问题讨论】:

    标签: css reactjs material-ui jss higher-order-components


    【解决方案1】:

    如果你使用的是无状态功能组件,你应该使用makeStyles()而不是withStyles()

    • withStyles() 是 HOC,通常与基于类的组件一起使用。
    • makeStyles()则是钩子创建者,钩子更适合功能组件。我建议您和您的孩子使用这种方法,因为越来越多的库采用钩子作为主要 API 而不是 HOC。

    您可以查看ListItem css 类和类键here 的列表以了解要应用到哪个类。

    const useStyles = makeStyles({
      root: {
        "& .Mui-selected": {
          backgroundColor: "pink",
          color: "red",
          fontWeight: "bold"
        },
        "& .Mui-selected:hover": {
          backgroundColor: "tomato"
        }
      }
    });
    
    function App() {
      const [selected, setSelected] = React.useState("home");
      const styles = useStyles();
    
      return (
        <List className={styles.root}>
          ...
        </List>
      );
    }
    

    如果你想使用class key(selected)而不是css class(Mui-selected),你可以这样写

    const useStyles = makeStyles({
      root: {
        "&$selected": {
          backgroundColor: "pink",
          color: "red",
          "&:hover": {
            backgroundColor: "tomato"
          }
        }
      },
      selected: {}
    });
    

    并像这样应用于组件

    <List>
      <ListItem
        classes={{
          root: styles.root,
          selected: styles.selected
        }}
        ...
      >
        ...
      </ListItem>
      ...
    </List>
    

    此时您应该考虑将ListItem 重构为单独的组件以清理重复的代码。

    现场示例

    【讨论】:

    • 感谢您提供如此详细的答案!我喜欢你如何将 makeStyles 描述为 withStyles 的等价物。作为旁注,您提到 withStyles 仅适用于基于类,但我认为它也适用于功能组件:codesandbox.io/s/…
    • 另外,我们如何修改样式以使用“selected”而不是“.Mui-selected”,就像在 MenuItem 示例中一样? [material-ui.com/customization/components/#pseudo-classes]
    • 我看到你甚至添加了使用“selected”的代码,你太棒了!我不确定是否完全理解:您是否有关于“类密钥”的文档的指针?另外,你为什么需要空的selected: {}
    • @LouisCoulet 请参阅此答案here 了解更多信息。如果您将样式放在 select 而不是 root 中,则由于 css 的特殊性,样式将被覆盖。 selected: {} 会在选中时为ListItem 生成适当的类名
    • 如果您想覆盖 UI 的某些部分,每个 Material-UI 组件都有一些特定的 css 类和类键。 HereListItem 的 css 类(全局类列)和类键(规则名称列)(已在我的答案中链接)。
    猜你喜欢
    • 2018-11-20
    • 2020-11-16
    • 2019-11-21
    • 2020-06-21
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 2019-06-14
    相关资源
    最近更新 更多