【问题标题】:How to target button base with material-ui and styled-components如何使用 material-ui 和 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!*/}
  }
`;

【问题讨论】:

    标签: css reactjs material-ui gatsby styled-components


    【解决方案1】:

    你的代码有两个问题:

    • 您正在使用MuiButtonBase CSS 类,但这不存在。正确的CSS class nameMuiButtonBase-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>
      );
    }
    

    【讨论】:

      猜你喜欢
      • 2020-06-28
      • 2020-11-16
      • 2021-10-13
      • 2019-08-02
      • 2020-01-16
      • 2020-05-06
      • 2020-05-12
      • 2021-05-19
      • 2021-11-19
      相关资源
      最近更新 更多