使用 styled-components 覆盖 material-ui 按钮样式

Posted

技术标签:

【中文标题】使用 styled-components 覆盖 material-ui 按钮样式【英文标题】:Override material-ui button styles with styled-components 【发布时间】:2020-06-28 13:16:54 【问题描述】:

我正在使用material-ui button 并尝试通过样式组件覆盖边界半径(即设为 0)。但是,它不起作用。

代码:

import React from "react";
import styled from "styled-components";
import  Button  from "@material-ui/core";

const StyledButton = styled(Button)`
  background-color: #d29d12;
  border-radius: 0;
`;

export default function App() 
  return <StyledButton>Hello</StyledButton>;

【问题讨论】:

【参考方案1】:

通过给StyledButton添加className,可以覆盖MUI按钮样式,

<StyledButton className='myclassName'>Hello</styledButton>

const StyledButton = styled(Button)`
 &.myclassName 
    background-color: red,
    border-radius: 0
  
`;

【讨论】:

【参考方案2】:

const StyledButton = styled(Button)(
  '&&&': 
    backgroundColor: red,
    borderRadius: 0
  
)

【讨论】:

【参考方案3】:

使用 styled-components 更高特异性的语法: https://styled-components.com/docs/faqs#how-can-i-override-styles-with-higher-specificity

const StyledButton = styled(Button)`
  && 
    background-color: red;
    border-radius: 0;
  
`;

【讨论】:

【参考方案4】:

默认情况下,Material-UI 在&lt;head&gt; 元素的末尾注入样式。这意味着它的样式将 styled-components 生成的样式之后出现,因此当CSS specificity 相同时,Material-UI 样式将胜过 styled-components 样式。

您可以使用带有injectFirst 属性的StylesProvider 组件将Material-UI 样式移动到&lt;head&gt; 的开头,然后styled-components 样式将紧随其后并获胜。

import React from "react";
import styled from "styled-components";
import Button from "@material-ui/core/Button";
import  StylesProvider  from "@material-ui/core/styles";

const StyledButton = styled(Button)`
  background-color: red;
  border-radius: 0;
`;

export default function App() 
  return (
    <StylesProvider injectFirst>
      <div className="App">
        <StyledButton>Hello</StyledButton>
      </div>
    </StylesProvider>
  );

相关答案:

Media Queries in Material-UI Using Styled-Components

【讨论】:

我认为这实际上是基于 ops question 和 Material UI Docs 的正确答案。 使用injectFirst 将样式移动到head 的开头,但也会导致将meta 标签推到它们下面,W3C 验证器会发出一些关于“在之后找到的元元素上的字符集属性”的错误前 1024 个字节”。有什么想法吗? @n4m31ess_c0d3r 文档here 提供了有关如何控制精确插入点的详细信息。【参考方案5】:

您可以通过将 !important 应用于您的样式化组件来覆盖按钮的默认边框半径。

const StyledButton = styled(Button)`
  borderRadius: 0px !important;
`;

【讨论】:

以上是关于使用 styled-components 覆盖 material-ui 按钮样式的主要内容,如果未能解决你的问题,请参考以下文章

使用 Styled-Components 在 React Bootstrap 中覆盖嵌套样式

styled-components不能覆盖antd组件样式?

Storybook + Ionic React + styled-components CSS 顺序问题

styled-components:使用额外的样式扩展现有组件

在 Styled-Component 类之前添加静态父类

如何自定义 Material-UI 和 styled-components 基于 props 的样式