【问题标题】:How to keep the background color of disabled Button in Material-UI?如何在 Material-UI 中保持禁用按钮的背景颜色?
【发布时间】:2021-11-19 02:22:14
【问题描述】:

我想从Material-UI 更改禁用的Button 组件的全局样式。但问题是我无法保留按钮的原始配色方案。

考虑一下这个按钮:

<Button color="secondary" disabled={isLoading}>Create Account</Button>

现在默认情况下Mui-disabled 将附加到此按钮。其colorbackground-color 取自theme.palatte.action 属性。所以这个禁用的按钮的 CSS 如下:

color: rgba(0,0,0,0.26);
box-shadow: none;
background-color: rgba(0,0,0,0.12);

但我希望我的禁用按钮保持其原始颜色(“主要、次要”、“错误”等)添加不透明度0.7。默认情况下,光标事件由 MUI 设置为无。

我尝试使用自定义主题,但我不知道如何保持按钮的原始颜色。例如,如果Buttonprimary,则保留原色,如果Buttonsecondary,则保留辅助色。

    MuiButton: {
        styleOverrides: {
            root: {
                textTransform: "none",
                boxShadow: "none",
                "&.Mui-disabled": {
                    // background: "initial",
                    // color: "initial",
                    opacity: .7
                }
            },
        }
    }

当然,我不想为每个代码编写自定义代码。我甚至可以通过在 MUI 的按钮周围创建一个包装器并在我的代码中的任何地方使用该包装器来做到这一点。 但我想通过覆盖主题以 MUI 方式来实现。

如何实施全局解决方案?

【问题讨论】:

    标签: reactjs material-ui


    【解决方案1】:

    这是你想要的吗?只是不要在palette 中设置disabledBackground 颜色:

    import Button, { buttonClasses } from "@mui/material/Button";
    import { createTheme, ThemeProvider } from "@mui/material/styles";
    
    const defaultTheme = createTheme();
    const theme = createTheme({
      palette: {
        action: {
          disabledBackground: "", // don't set the disable background color
          disabled: "white", // set the disable foreground color
        }
      },
      components: {
        MuiButtonBase: {
          styleOverrides: {
            root: {
              [`&.${buttonClasses.disabled}`]: {
                opacity: 0.5
              },
              // Fix ButtonGroup disabled styles.
              [`&.${toggleButtonClasses.root}.${buttonClasses.disabled}`]: {
                color: defaultTheme.palette.action.disabled,
                borderColor: defaultTheme.palette.action.disabledBackground
              }
            }
          }
        }
      }
    );
    

    目前我正在写作。还有其他 components 重用了 disableBackground 属性,请确保您看一下并且也可以接受。我将它们全部显示在下面的示例中。

    现场演示

    【讨论】:

    • 已经试过了。这行不通。因为空字符串是无效值,所以 Mui-disabled 样式将被应用
    • @TheCoder 请看一下现场示例。它在那里工作正常。
    • 我的错,我在手机上看到了你的解决方案。并假设您只是将空字符串设置为&amp;.Mui-disabled。您实际上是在更改 palatte.action 属性。是的,它有效。我假设这会改变所有组件的禁用颜色,而不仅仅是按钮?而且我觉得我很好。
    • @TheCoder 是的。我在演示中向您展示了受该更改影响的所有组件,因此您可以决定这种方法是否适合您。
    • 这仅适用于“包含”按钮。如果背景颜色为白色,则禁用按钮的文本将不可见
    【解决方案2】:

    以默认样式处理禁用状态的方式,我认为您需要在覆盖中重新定义默认颜色才能使其正常工作。

    在源代码中,您可以找到如何为 textoutlinedcontained 变体定义默认颜色。

    下面的示例演示了通过在"&amp;.Mui-disabled" 样式覆盖中重新定义非禁用颜色来使用opacity: 0.7 覆盖所有三个变体的禁用样式。

    import * as React from "react";
    import Stack from "@mui/material/Stack";
    import Button from "@mui/material/Button";
    import { createTheme, ThemeProvider } from "@mui/material/styles";
    import { alpha } from "@mui/system";
    const defaultTheme = createTheme();
    const colors = [
      "inherit",
      "primary",
      "secondary",
      "success",
      "error",
      "info",
      "warning"
    ];
    const containedColorStyles = {};
    const textColorStyles = {};
    const outlinedColorStyles = {};
    function capitalizeFirstLetter(string) {
      return string.charAt(0).toUpperCase() + string.slice(1);
    }
    colors.forEach((color) => {
      containedColorStyles[`&.MuiButton-contained${capitalizeFirstLetter(color)}`] =
        color === "inherit"
          ? {
              backgroundColor: defaultTheme.palette.grey[300],
              color: defaultTheme.palette.getContrastText(
                defaultTheme.palette.grey[300]
              )
            }
          : {
              backgroundColor: defaultTheme.palette[color].main,
              color: defaultTheme.palette[color].contrastText
            };
      textColorStyles[`&.MuiButton-text${capitalizeFirstLetter(color)}`] =
        color === "inherit"
          ? {
              color: "inherit"
            }
          : {
              color: defaultTheme.palette[color].main
            };
      outlinedColorStyles[`&.MuiButton-outlined${capitalizeFirstLetter(color)}`] =
        color === "inherit"
          ? {
              color: "inherit",
              borderColor:
                defaultTheme.palette.mode === "light"
                  ? "rgba(0, 0, 0, 0.23)"
                  : "rgba(255, 255, 255, 0.23)"
            }
          : {
              color: defaultTheme.palette[color].main,
              borderColor: `${alpha(defaultTheme.palette[color].main, 0.5)}`
            };
    });
    const theme = createTheme({
      components: {
        MuiButton: {
          styleOverrides: {
            root: {
              textTransform: "none",
              boxShadow: "none",
              "&.Mui-disabled": {
                ...containedColorStyles,
                ...textColorStyles,
                ...outlinedColorStyles,
                opacity: 0.7
              }
            }
          }
        }
      }
    });
    export default function ColorButtons() {
      const variants = ["text", "outlined", "contained"];
      return (
        <ThemeProvider theme={theme}>
          {variants.map((variant) => (
            <div key={variant}>
              {capitalizeFirstLetter(variant)} Variant
              <Stack direction="row" spacing={2}>
                {colors.map((color) => (
                  <Button key={color} variant={variant} color={color}>
                    {capitalizeFirstLetter(color)}
                  </Button>
                ))}
              </Stack>
              Disabled {capitalizeFirstLetter(variant)} Variant
              <Stack direction="row" spacing={2} sx={{ mb: 2 }}>
                {colors.map((color) => (
                  <Button key={color} disabled variant={variant} color={color}>
                    {capitalizeFirstLetter(color)}
                  </Button>
                ))}
              </Stack>
            </div>
          ))}
        </ThemeProvider>
      );
    }
    

    【讨论】:

    • 感谢瑞恩的详细回答。
    猜你喜欢
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多