您可以在Material UI中添加其他颜色吗? [英] Can you add an additional color in Material UI?

查看:83
本文介绍了您可以在Material UI中添加其他颜色吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经有一个要在Material UI中实现的样式指南.我可以看到Button的颜色道具采用了以下选项:

  |'默认'|'继承'|'基本的'|中学" 

但是我还需要一个:

  |'默认'|'继承'|'基本的'|中学"|'第三' 

您可以在Material UI中创建与常规主题系统一起使用的新颜色吗?还是这不是应该使用的方式?

解决方案

尽管Material-UI不直接支持此功能,但是您可以将 Button 包装在您自己的自定义组件中以添加此功能.

下面的代码使用

I already have a styleguide that I'm trying to implement in Material UI. I can see the Button's color prop takes these options:

| 'default'
| 'inherit'
| 'primary'
| 'secondary'

However I need an additional one:

| 'default'
| 'inherit'
| 'primary'
| 'secondary'
| 'tertiary'

Can you create a new color in Material UI that works with the general theming system? Or is this not really how it's supposed to be used?

解决方案

Though Material-UI does not support this directly, you can wrap Button in your own custom component to add this functionality.

The code below uses a copy of the styles for textPrimary, outlinedPrimary, and containedPrimary but replaces "primary" with "tertiary".

import * as React from "react";
import Button from "@material-ui/core/Button";
import { makeStyles } from "@material-ui/core/styles";
import clsx from "clsx";
import { fade } from "@material-ui/core/styles/colorManipulator";

const useStyles = makeStyles(theme => ({
  textTertiary: {
    color: theme.palette.tertiary.main,
    "&:hover": {
      backgroundColor: fade(
        theme.palette.tertiary.main,
        theme.palette.action.hoverOpacity
      ),
      // Reset on touch devices, it doesn't add specificity
      "@media (hover: none)": {
        backgroundColor: "transparent"
      }
    }
  },
  outlinedTertiary: {
    color: theme.palette.tertiary.main,
    border: `1px solid ${fade(theme.palette.tertiary.main, 0.5)}`,
    "&:hover": {
      border: `1px solid ${theme.palette.tertiary.main}`,
      backgroundColor: fade(
        theme.palette.tertiary.main,
        theme.palette.action.hoverOpacity
      ),
      // Reset on touch devices, it doesn't add specificity
      "@media (hover: none)": {
        backgroundColor: "transparent"
      }
    }
  },
  containedTertiary: {
    color: theme.palette.tertiary.contrastText,
    backgroundColor: theme.palette.tertiary.main,
    "&:hover": {
      backgroundColor: theme.palette.tertiary.dark,
      // Reset on touch devices, it doesn't add specificity
      "@media (hover: none)": {
        backgroundColor: theme.palette.tertiary.main
      }
    }
  }
}));

const CustomButton = React.forwardRef(function CustomButton(
  { variant = "text", color, className, ...other },
  ref
) {
  const classes = useStyles();
  return (
    <Button
      {...other}
      variant={variant}
      color={color === "tertiary" ? "primary" : color}
      className={clsx(className, {
        [classes[`${variant}Tertiary`]]: color === "tertiary"
      })}
      ref={ref}
    />
  );
});
export default CustomButton;

Then this CustomButton component can be used instead of Button:

import React from "react";
import {
  makeStyles,
  createMuiTheme,
  ThemeProvider
} from "@material-ui/core/styles";
import Button from "./CustomButton";
import lime from "@material-ui/core/colors/lime";

const useStyles = makeStyles(theme => ({
  root: {
    "& > *": {
      margin: theme.spacing(1)
    }
  }
}));

const theme = createMuiTheme({
  palette: {
    tertiary: lime
  }
});
// This is a step that Material-UI automatically does for the standard palette colors.
theme.palette.tertiary = theme.palette.augmentColor(theme.palette.tertiary);

export default function ContainedButtons() {
  const classes = useStyles();

  return (
    <ThemeProvider theme={theme}>
      <div className={classes.root}>
        <Button variant="contained">Default</Button>
        <Button variant="contained" color="primary">
          Primary
        </Button>
        <Button variant="contained" color="secondary">
          Secondary
        </Button>
        <br />
        <Button variant="contained" color="tertiary">
          Tertiary
        </Button>
        <Button color="tertiary">Tertiary text</Button>
        <Button variant="outlined" color="tertiary">
          Tertiary outlined
        </Button>
      </div>
    </ThemeProvider>
  );
}

这篇关于您可以在Material UI中添加其他颜色吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆