如何使用 material-ui 和 styled-components 定位按钮库

Posted

技术标签:

【中文标题】如何使用 material-ui 和 styled-components 定位按钮库【英文标题】:How to target button base with material-ui and styled-components 【发布时间】:2020-05-14 11:12:37 【问题描述】:

使用material-ui 中的ToggleButtonToggleButtonGroup 组件,从material-ui 的gatsby template 开始。为了避免常见的material-ui errors with production builds 也尝试使用styled-components

我有以下反应代码无法正确定位材料 ui 基本按钮。

如何使用 styled-components 正确地做到这一点 我是否缺少最佳实践?

(我知道材质 ui 可能在布局上固执己见,但我说我想要基本元素的悬停或文本颜色。

// Also imports React, gatsby packages etc

import ToggleButton from '@material-ui/lab/ToggleButton';
import ToggleButtonGroup from '@material-ui/lab/ToggleButtonGroup';
import styled from 'styled-components';

const StyledToggleButton = styled(ToggleButton)`
  color: black;
  $'' /* Do not care as much in this section */

  & .MuiButtonBase
    color: pink;
    border-radius: 10em;
     $'' /* THIS IS WHERE I WANT TO EFFECT THE BASE BUTTONS! DO NOT THINK .MuiButtonBase is correct!*/
  
`;

【问题讨论】:

【参考方案1】:

你的代码有两个问题:

您正在使用MuiButtonBase CSS 类,但这不存在。正确的CSS class name 是MuiButtonBase-root。 您使用descendant selector 引用CSS 类,但MuiButtonBase-root 位于根元素上(即styled-components 类名称将应用于相同的元素),因此适当的语法是&.MuiButtonBase-root( & 号后面没有空格)。在这种情况下,.MuiButtonBase-root 的唯一效果是increase the specificity,以便它胜过默认样式。使用&& 也可以达到同样的效果(即将生成的类名加倍)。

下面是一个示例,展示了几种指定样式的不同方式,所有这些方式都具有相同的特异性。

import React from "react";
import  makeStyles, StylesProvider  from "@material-ui/core/styles";
import FormatAlignLeftIcon from "@material-ui/icons/FormatAlignLeft";
import FormatAlignCenterIcon from "@material-ui/icons/FormatAlignCenter";
import FormatAlignRightIcon from "@material-ui/icons/FormatAlignRight";
import FormatAlignJustifyIcon from "@material-ui/icons/FormatAlignJustify";
import ToggleButton from "@material-ui/lab/ToggleButton";
import ToggleButtonGroup from "@material-ui/lab/ToggleButtonGroup";
import styled from "styled-components";

const useStyles = makeStyles(theme => (
  toggleContainer: 
    margin: theme.spacing(2, 0)
  
));

const StyledToggleButton1 = styled(ToggleButton)`
  && 
    color: pink;
    border-radius: 10em;
  
`;
const StyledToggleButton2 = styled(ToggleButton)`
  &.MuiToggleButton-root 
    color: blue;
    border-radius: 1em;
  
`;
const StyledToggleButton3 = styled(ToggleButton)`
  &.MuiButtonBase-root 
    color: purple;
    border-color: blue;
  
`;

export default function ToggleButtons() 
  const [alignment, setAlignment] = React.useState("left");

  const handleAlignment = (event, newAlignment) => 
    setAlignment(newAlignment);
  ;

  const classes = useStyles();

  return (
    <StylesProvider injectFirst>
      <div className=classes.toggleContainer>
        <ToggleButtonGroup
          value=alignment
          exclusive
          onChange=handleAlignment
          aria-label="text alignment"
        >
          <StyledToggleButton1 value="left" aria-label="left aligned">
            <FormatAlignLeftIcon />
          </StyledToggleButton1>
          <StyledToggleButton2 value="center" aria-label="centered">
            <FormatAlignCenterIcon />
          </StyledToggleButton2>
          <StyledToggleButton3 value="right" aria-label="right aligned">
            <FormatAlignRightIcon />
          </StyledToggleButton3>
          <ToggleButton value="justify" aria-label="justified">
            <FormatAlignJustifyIcon />
          </ToggleButton>
        </ToggleButtonGroup>
      </div>
    </StylesProvider>
  );

【讨论】:

以上是关于如何使用 material-ui 和 styled-components 定位按钮库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 styled-components 将 prop 传递给 Material-UI 组件

如何将 Nextjs + styled-components 与 material-ui 集成

使用 styled-components 和 Material-UI withStyles 的 TextField 样式

如何使用 Material-UI 中的 useTheme 钩子?

Material-UI 中使用 Styled-Components 的媒体查询

找不到模块“material-ui/styles/MuiThemeProvider”的声明文件?