【问题标题】:Material Ui button colors not changed after theme change主题更改后材质 Ui 按钮颜色未更改
【发布时间】:2019-06-03 01:54:31
【问题描述】:

在项目中使用了 react Material Ui。主题被覆盖,但按钮和输入的颜色没有改变。

这里是创建 Material Ui 主题的theme.js

// @flow
import { createMuiTheme } from '@material-ui/core';

import type
{
  Theme,
} from '@material-ui/core';

const theme: Theme = createMuiTheme({
  palette: {
    primary: {
      main: '#ffa300',
      light: '#ffd449',
      dark: '#c67400',
      contrastText: '#000000',
    },
    secondary: {
      main: '#ff8500',
      light: '#ffb644',
      dark: '#c55600',
      contrastText: '#000000',
    },
    error: {
      main: '#A21C2B',
    },
  },
});


export default theme;

这里是App.js

import React from 'react';
import { ThemeProvider } from '@material-ui/styles';
import CssBaseline from '@material-ui/core/CssBaseline';
import {
  Switch,
} from 'react-router-dom';
import theme from './theme';
import Auth from './Auth';

const App = () => (
  <ThemeProvider theme={theme}>
    <CssBaseline />
    <Switch>
      <Auth />
    </Switch>
  </ThemeProvider>
);

export default App;

注意这里使用了新的ThemeProvider,因为稍后会使用钩子。

这是一个示例登录页面

// @flow
import * as React from 'react';
import Avatar from '@material-ui/core/Avatar';
import Button from '@material-ui/core/Button';
import FormControl from '@material-ui/core/FormControl';
import FormControlLabel from '@material-ui/core/FormControlLabel';
import Checkbox from '@material-ui/core/Checkbox';
import Input from '@material-ui/core/Input';
import InputLabel from '@material-ui/core/InputLabel';
import LockIcon from '@material-ui/icons/LockOutlined';
import Paper from '@material-ui/core/Paper';
import Typography from '@material-ui/core/Typography';
import { makeStyles } from '@material-ui/styles';

const useStyles = makeStyles(theme => ({
  main: {
    width: 'auto',
    display: 'block', // Fix IE 11 issue.
    marginLeft: theme.spacing.unit * 3,
    marginRight: theme.spacing.unit * 3,
    [theme.breakpoints.up(400 + theme.spacing.unit * 3 * 2)]: {
      width: 400,
      marginLeft: 'auto',
      marginRight: 'auto',
    },
  },
  paper: {
    marginTop: theme.spacing.unit * 8,
    display: 'flex',
    flexDirection: 'column',
    alignItems: 'center',
    padding: `${theme.spacing.unit * 2}px\
    ${theme.spacing.unit * 3}px\
    ${theme.spacing.unit * 3}px`,
  },
  avatar: {
    margin: theme.spacing.unit,
    backgroundColor: theme.palette.secondary.main,
  },
  form: {
    width: '100%', // Fix IE 11 issue.
    marginTop: theme.spacing.unit,
  },
  submit: {
    marginTop: theme.spacing.unit * 3,
  },
}));

const Login = (props) => {
  const classes = useStyles();

  return (
    <main className={classes.main}>
      <Paper className={classes.paper}>
        <Avatar className={classes.avatar}>
          <LockIcon />
        </Avatar>
        <Typography component="h1" variant="h5">
          Sign in
        </Typography>
        <form className={classes.form}>
          <FormControl margin="normal" required fullWidth>
            <InputLabel htmlFor="email">Email Address</InputLabel>
            <Input id="email" name="email" autoComplete="email" autoFocus />
          </FormControl>
          <FormControl margin="normal" required fullWidth>
            <InputLabel htmlFor="password">Password</InputLabel>
            <Input
              name="password"
              type="password"
              id="password"
              autoComplete="current-password"
            />
          </FormControl>
          <FormControlLabel
            control={<Checkbox value="remember" color="primary" />}
            label="Remember me"
          />
          <Button
            type="submit"
            fullWidth
            variant="contained"
            color="primary"
            className={classes.submit}
          >
            Sign in
          </Button>
        </form>
      </Paper>
    </main>
  );
};

export default Login;

这就是问题所在。按钮和输入的颜色没有改变。但是LockIcon的颜色变成了主题提供的颜色。

【问题讨论】:

标签: javascript reactjs material-ui


【解决方案1】:

更新

下面的答案是针对在 3.x 版本的 Material-UI 中使用 @material-ui/styles 的。 Material-UI v4 不再需要这些安装步骤 (bootstrapMuiStyles.js)。


最初我建议也使用MuiThemeProvider 进行包装。这可行,但这是错误的解决方案,并且在尝试使用新的 @material-ui/styles 包时可能会导致更多问题。根据 Josh Wooding 的评论,然后阅读文档中的详细信息并查看一些代码,以下是符合 Josh 建议的解决方案。摘录来自我的 CodeSandbox,因此由于简化/更改(例如不使用类型)而存在一些差异,我对您的代码做了一个工作示例。重要的部分只是index.jsbootstrapMuiStyles.js——尤其是导入的顺序。直接从index.js 导入install 方法是行不通的,因为这会在你已经导入App.js 之后强制你调用install()

index.js

import React from "react";
import ReactDOM from "react-dom";
// It is important for this import to be before the import of App
// so that no other Material-UI imports happen before the install
import "./bootstrapMuiStyles";
import App from "./App";

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

bootstrapMuiStyles.js

import { install } from "@material-ui/styles";
install();

App.js

import React from "react";
import { ThemeProvider } from "@material-ui/styles";
import CssBaseline from "@material-ui/core/CssBaseline";
import theme from "./theme";
import Login from "./Login";

const App = () => (
  <ThemeProvider theme={theme}>
    <CssBaseline />
    <Login />
  </ThemeProvider>
);
export default App;

然后Login.js 是您问题代码的几乎完全相同的副本。

你可以在这里看到这个工作:

【讨论】:

    【解决方案2】:

    在版本 4 中,此主题提供程序不起作用。

    <ThemeProvider theme={theme}>
    

    主题是

    import { createMuiTheme } from "@material-ui/core/styles";
    import { red } from "@material-ui/core/colors";
    
    // Create a theme instance.
    const theme = createMuiTheme({
      palette: {
        primary: {
          main: "#06a3b8"
        },
        secondary: {
          main: "#ff7c04"
        },
        error: {
          main: red.A400
        },
        background: {
          default: "#ffffff"
        }
      },
      typography: {
        useNextVariants: true
      }
    });
    
    export default theme;
    

    【讨论】:

    • 这是个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2021-08-14
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    相关资源
    最近更新 更多