如何添加多个材质UI调色板颜色

Bet*_*any 11 themes reactjs material-ui

我正在尝试建立自己的调色板颜色以匹配Material UI中的品牌.到目前为止,我只能将主要和次要颜色作为按钮的背景颜色应用.当我添加自己的变量名称或使用"重音"时,如Material UI网站上的示例所示,按钮默认为灰色.

这是我的MyTheme.js代码:

import { createMuiTheme } from 'material-ui/styles';
import purple from 'material-ui/colors/purple';

export default createMuiTheme({
    palette: {
        primary: { // works
          main: '#165788',
          contrastText: '#fff',
        },
        secondary: { // works
          main: '#69BE28',
          contrastText: '#fff',
        },
        companyBlue: { // doesnt work - defaults to a grey button
            main: '#65CFE9',
            contrastText: '#fff',
        },
        companyRed: { // doesnt work - grey button
            main: '#E44D69',
            contrastText: '#000',
        },
        accent: { // doesnt work - grey button
            main: purple, // import purple doesnt work
            contrastText: '#000',
        },
    },
});
Run Code Online (Sandbox Code Playgroud)

这是我的App.js代码:

import React, { Component } from 'react';
import Button from 'material-ui/Button';
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import MyTheme from './MyTheme';
import './App.css';
import { withStyles } from 'material-ui/styles';
import PropTypes from 'prop-types';


const styles = theme => ({
  button: {
    margin: theme.spacing.unit,
  },
  input: {
    display: 'none',
  },
});


class App extends Component {
  constructor(props)
  {
    super(props);
  }  

  render() {
    const { classes } = this.props;
    return (
      <MuiThemeProvider theme={MyTheme}>
          <Button variant="raised" >
          Default
          </Button>
          <Button variant="raised" color="primary" className={classes.button}>
          Primary
          </Button>
          <Button variant="raised" color="secondary" className={classes.button}>
          Secondary
          </Button>
          <Button variant="raised" color="companyRed" className={classes.button}>
          Company Red
          </Button>
          <Button variant="raised" color="accent" className={classes.button}>
          Accent
          </Button>
      </MuiThemeProvider>
      );
  }
}

App.propTypes = {
  classes: PropTypes.object.isRequired,
};

export default withStyles(styles)(App);
Run Code Online (Sandbox Code Playgroud)

Nea*_*arl 57

Material UI 调色板是可扩展的,但您需要执行一些操作来创建新颜色并将其应用到您的Button组件。

\n

首先,让\xe2\x80\x99s 定义一个带有自定义颜色变量的主题。您可以使用augmentColor()来生成 ,PaletteColor以便可以在您的 中使用它Button

\n
import { purple } from "@mui/material/colors";\n\nconst { palette } = createTheme();\nconst theme = createTheme({\n  palette: {\n    myAwesomeColor: palette.augmentColor({ color: purple }),\n    // Use this code if you want to use an arbitrary color\n    // myAwesomeColor: palette.augmentColor({\n    //   color: {\n    //     main: "#00ff00"\n    //   }\n    // })\n  }\n});\n
Run Code Online (Sandbox Code Playgroud)\n

然后更新您的TypeScript 定义myAwesomeColor,以便在引用Palette和对象时它可以识别该属性PaletteOption(如果您使用的是 JavaScript,请跳过此步骤)。您还需要扩展Button\ 的颜色属性定义,因为默认情况下它只接受以下值:

\n
\'inherit\' | \'primary\' | \'secondary\' | \'success\' | \'error\' | \'info\' | \'warning\'\n
Run Code Online (Sandbox Code Playgroud)\n
declare module "@mui/material/styles" {\n  interface Palette {\n    myAwesomeColor: string;\n  }\n  interface PaletteOptions {\n    myAwesomeColor: string;\n  }\n}\n\ndeclare module "@mui/material/Button" {\n  interface ButtonPropsColorOverrides {\n    myAwesomeColor: true;\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

最后一步是注入自定义主题并为您设置自定义颜色Button

\n
<ThemeProvider theme={theme}>\n  <Button color="myAwesomeColor" variant="contained">\n    AWESOME\n  </Button>\n</ThemeProvider>\n
Run Code Online (Sandbox Code Playgroud)\n

现场演示

\n

Codesandbox 演示

\n

相关答案

\n\n

  • @NearHuscarl 在您的示例(和 mui 的文档)中,您添加了专门针对按钮的模块增强。我认为大多数人都想向根(?)调色板添加一种颜色,并观察它增强每个 mui 组件。您是否找到了一种解决方案,无需增加每个组件即可使颜色全局可用? (2认同)

Col*_*rdo 6

除了需要将purple您的内容更改MyTheme为类似的内容外purple[500],我不确定为什么这对您不起作用。您确定可以用primary和以外的其他方法覆盖secondary吗?

无论如何,这是一种解决方法:

MyTheme.js

accent: { backgroundColor: purple[500], color: '#000' }
Run Code Online (Sandbox Code Playgroud)

然后在App.js

<Button 
  variant="raised" 
  style={MyTheme.palette.accent} 
  className={classes.primary}>
    Accent
</Button>
Run Code Online (Sandbox Code Playgroud)

这里的工作示例。

  • 谢谢!我查看了您的示例,我的自定义彩色变量有效。对于看这篇文章的任何人,答案如下:&lt;Button style={MyTheme.palette.companyRed} &gt; (3认同)