【问题标题】:Override a Material UI style without using an HOC?在不使用 HOC 的情况下覆盖 Material UI 样式?
【发布时间】:2019-07-20 08:45:33
【问题描述】:

有没有什么方法可以覆盖 Material UI 组件的样式,而不必使用 withStyles() 创建一个全新的组件?

例如,假设我正在渲染以下内容,我只想更改“删除”标签的颜色:

<div style={styles.rowFooter}>
  <FormControlLabel
    control={<ClearIcon />}
    label="Clear"
    title="Clear all fields."
    onClick={clearFields}
  />
  <FormControlLabel
    control={<DeleteIcon />}
    label="Delete"
    title="Delete this row."
    onClick={deleteRow}
  />
</div>

为此,我通常必须:

  • 创建一个返回 { color: "maroon" } 的新样式函数。
  • 创建一个新组件来呈现“删除”按钮。
  • 包装我的新组件withStyles(newStylesFn)(MyComponent)

但我不想做所有这些。有什么办法可以避免吗?

更新:

我知道的一种方法是传递一个 CSS className。我一直在寻找除此之外的东西,因为在这种情况下它甚至无法覆盖嵌套元素。

我真正想做的只是传递style={{ color: "maroon" }},但这只会改变图标的​​颜色,而不是实际的标签文本......

【问题讨论】:

    标签: css reactjs material-ui jss css-in-js


    【解决方案1】:

    您可以使用 classes 属性来覆盖 Material UI 提供的样式,而不是 className

    <FormControlLabel
      control={<DeleteIcon />}
      label="Delete"
      title="Delete this row."
      classes={{
        label: 'labelStyle'
      }}
    />
    

    styles.css

    .labelStyle {
      color: maroon !important;
    }
    

    虽然它不是完美的解决方案,但它仍然可以在不使用 withStyles() 的情况下完成工作。

    【讨论】:

    • 非常感谢@Yakov-Kiszner。我在文档中找不到任何提及这一点。如果有人知道它在哪里,请添加到这个答案。谢谢!
    • 同样相关 - 在此解决方案之前,我尝试使用常规 CSS,并阅读了有关如何更改 JSS 插入点的信息,因此您不必使用 !importantCSS Injection order
    • 看起来文档鼓励通过使用 JSS 库来使用 CSS-in-JS。您可以通过A Journey toward better style 了解更多信息。但是,文档还向您展示了如何使用带有 JSS(而不是 CSS)的类。 Overriding with classes
    • 这两本书我都读过了,谢谢。带有 CSS 变量的 CSS 模块是未来的 IMO,我将尽可能避免使用 JSS 和其他 CSS-in-JS 工具包。
    猜你喜欢
    • 2018-10-30
    • 2020-01-30
    • 2019-03-07
    • 1970-01-01
    • 2020-05-27
    • 2020-07-10
    • 2020-08-10
    • 2021-06-30
    • 1970-01-01
    相关资源
    最近更新 更多