MUI 自定义按钮颜色?

IT技术 javascript reactjs material-ui
2021-04-15 01:28:50

我正在努力修改 MUI next (v1) 中的按钮颜色。

我如何将 muitheme 设置为与 bootstrap 相似,所以我可以只对红色使用“btn-danger”,对绿色使用“btn-success”......?

我尝试过自定义,className但它不能正常工作(悬停颜色不会改变)并且它似乎是重复的。我有哪些选择?

6个回答

我在这个线程中使用 Brendans 的答案提出了这个解决方案。希望它会帮助处于类似情况的人。

import React, { Component } from 'react'
import { MuiThemeProvider, createMuiTheme } from 'material-ui/styles'
import Button from 'material-ui/Button'
import { red, blue } from 'material-ui/colors'

const redTheme = createMuiTheme({ palette: { primary: red } })
const blueTheme = createMuiTheme({ palette: { primary: blue } })

class Buttons extends Component {
  render = () => (
    <div className="ledger-actions-module">
      <MuiThemeProvider theme={redTheme}>
        <Button color="primary" variant="raised">
          Delete
        </Button>
      </MuiThemeProvider>
      <MuiThemeProvider theme={blueTheme}>
        <Button color="primary" variant="raised">
          Update
        </Button>
      </MuiThemeProvider>
    </div>
  )
}
对于 v4 import { ThemeProvider } from '@material-ui/styles'; import { createMuiTheme } from "@material-ui/core/styles";
2021-05-31 01:28:50
关于性能的注意事项 -> 如果您有一个包含 n 个项目的列表,每个项目都需要红色和蓝色按钮怎么办?这将需要 n * 2 个主题提供程序,并且最终可能会导致浏览器崩溃。对开发人员也不是很友好,因为这需要大量的样板代码来设置颜色。我发布了一个可能的解决方案,允许<Button color="error">下面等。
2021-06-09 01:28:50
这是一种解决方法,而不是真正的解决方案。我们应该能够使用简单的主题配置创建自定义按钮。
2021-06-10 01:28:50

你可以试试这个

<Button
    style={{
        borderRadius: 35,
        backgroundColor: "#21b6ae",
        padding: "18px 36px",
        fontSize: "18px"
    }}
    variant="contained"
    >
    Submit
</Button>
内联样式是一个hacky解决方案
2021-05-31 01:28:50

Bagelfp 的回答有错误,还有其他一些需要考虑的事情;

首先,“error”不是 material-ui@next v1 的Button 组件中支持的颜色主题color prop只接受“default”、“inherit”、“primary”和“secondary”。

这是迄今为止我发现的最简单的方法。首先,选择您最常用的两种主题颜色并将它们放在应用程序的根目录中。

import React from 'react';
import { Component } from './Component.js'
import { MuiThemeProvider, createMuiTheme } from 'material-ui/styles';

const theme = createMuiTheme({
  palette: {
    primary: 'purple',
    secondary: 'green',
    error: 'red',
  },
});

export class App extends Component {
  render() {
    return (
      <MuiThemeProvider theme={theme}>
        <Component />
        ...
      </MuiThemeProvider>
    );
  }
}

然后在你的组件中,选择你想要的颜色的主题;

import React from 'react';
import Button from 'material-ui/Button';

export const Component = (props) => (
  <div>
    <Button variant="fab" color="primary">
      I am purple, click me!
    </Button>
  </div>
)

如果您需要第三种和第四种颜色,您可以使用新的调色板导出 Component.js,就像您在 App.js 中所做的那样。

这是我发现的唯一可以保留变暗悬停效果的解决方案(没有一个官方覆盖示例保留了悬停功能)。我真的希望我能找到一种方法,在调用 Button 时简单地放入新的主题颜色,但目前这是最简单的方法。

编辑:我新的首选方法是使用 styled-components 和 material-ui buttonbase 创建一个 CustomButton 组件。我还将 styled-components 主题提供程序与我的 MuiThemeProvider 一起放在我的应用程序的根目录中。这使我可以轻松访问所有样式组件中的其他主题颜色,而无需导入和删除更多 ThemeProvider。在我的 CustomButton 的情况下,我只是给它一个themeprops,它直接传递给 .css 文件中的 css styled(ButtonBase)有关更多信息,请参阅样式组件文档。

你能展示你解释过的最后一种方法吗?(在最后的“编辑:”)
2021-05-25 01:28:50
主题定义还允许诸如main,darklight- 如默认主题所示的变体material-ui.com/customization/default-theme 有没有办法为dark变体设置颜色
2021-05-30 01:28:50
是的,只需输入 HEX 或 RGBA 作为调色板对象的一部分(我在这里写了紫色、绿色、红色)。
2021-06-05 01:28:50
@timbo 深色和浅色变体可以设置如下: const theme = createMuiTheme({ Palette: { error: { main: '#e9f0f3', dark: '#c9d9e0', light: '#ffff00' } }, });
2021-06-17 01:28:50
有什么方法可以让它与 #17a2b8 之类的自定义颜色代码一起使用吗?
2021-06-20 01:28:50

试试这个:

import * as React from 'react';
import Button, { ButtonProps } from "@material-ui/core/Button";
import { Theme } from '@material-ui/core';
import { withStyles } from '@material-ui/styles';

const styles: (theme: Theme) => any = (theme) => {
    return {
        root:{
            backgroundColor: theme.palette.error.main,
            color: theme.palette.error.contrastText,
            "&:hover":{
                backgroundColor: theme.palette.error.dark
            },
            "&:disabled":{
                backgroundColor: theme.palette.error.light
            }
        }
    };
};

export const ButtonContainedError = withStyles(styles)((props: ButtonProps) => {
    const { className, ...rest } = props;
    const classes = props.classes||{};
    return <Button {...props} className={`${className} ${classes.root}`} variant="contained" />
});

现在你有一个 ButtonContainedError 可以在任何地方使用。

并且与你的主题一致。

这样做的好处是,如果在您的主题中您只指定main颜色,则似乎可以正确计算暗和亮属性。前任。粉红色main值将导致深色和浅色分别为深粉色和浅粉色。
2021-06-20 01:28:50

您可以使用theme.palette.getContrastText()根据背景颜色值计算正确的文本颜色。

import { Button, makeStyles } from '@material-ui/core';

const useStyles = makeStyles((theme) => ({
  deleteButton: {
    // to make a red delete button
    color: theme.palette.getContrastText(theme.palette.error.main),
    background: theme.palette.error.main,
  }
}));

export const DeleteButton = () => {
  const classes = useStyles();
  return (
    <Button className={classes.deleteButton}>Delete</Button>
  );
}