使用 Material-UI 主题更改根背景颜色

新手上路,请多包涵

我正在尝试一些非常简单的事情:使用 Material-UI 主题为网站构建两个主题:

一个 light 主题和 dark 一个,但效果不佳:主题在每个 Material-UI 反应元素上,但 html 文档上的根元素保持相同的默认值白色背景。

当然可以通过纯.css攻击body来改变:

 body {
  background-color: #222;
}

但是我想用 React 动态地改变它,我虽然这会工作,但它没有:

 import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { ThemeProvider } from '@material-ui/styles';
import { MuiThemeProvider, createMuiTheme } from '@material-ui/core/styles';

const themeLight = createMuiTheme({
  palette: {
    background: {
      default: "#e4f0e2"
    }
  },
});

const themeDark = createMuiTheme({
  palette: {
    background: {
      default: "#222222",
    }
  },
});

ReactDOM.render(
  <MuiThemeProvider theme = { themeDark }>
    <App />
  </MuiThemeProvider>, document.getElementById('root'));

我在这里迷路了,没有办法用 Material-UI 主题制作这个吗?

原文由 yuri 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

CssBaseline 是控制这个方面的组件。如果您没有使用 CssBaseline ,那么您只会看到浏览器提供的默认值。

这是一个有效的 v4 示例(下方的 v5 示例):

 import React from "react";
import ReactDOM from "react-dom";
import CssBaseline from "@material-ui/core/CssBaseline";
import { MuiThemeProvider, createMuiTheme } from "@material-ui/core/styles";
import Button from "@material-ui/core/Button";

const themeLight = createMuiTheme({
  palette: {
    background: {
      default: "#e4f0e2"
    }
  }
});

const themeDark = createMuiTheme({
  palette: {
    background: {
      default: "#222222"
    },
    text: {
      primary: "#ffffff"
    }
  }
});

const App = () => {
  const [light, setLight] = React.useState(true);
  return (
    <MuiThemeProvider theme={light ? themeLight : themeDark}>
      <CssBaseline />
      <Button onClick={() => setLight(prev => !prev)}>Toggle Theme</Button>
    </MuiThemeProvider>
  );
};

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

编辑主题正文背景


下面是一个 Material-UI v5 示例。与 v4 的唯一区别是 ThemeProvider 的名称更改(尽管除了 MuiThemeProvider 之外,此名称在 v4 中也可用)和 createTheme (而不是 createMuiTheme )并使用新的 @mui/material 包名称而不是 @material-ui/core

 import React from "react";
import ReactDOM from "react-dom";
import CssBaseline from "@mui/material/CssBaseline";
import { ThemeProvider, createTheme } from "@mui/material/styles";
import Button from "@mui/material/Button";

const themeLight = createTheme({
  palette: {
    background: {
      default: "#e4f0e2"
    }
  }
});

const themeDark = createTheme({
  palette: {
    background: {
      default: "#222222"
    },
    text: {
      primary: "#ffffff"
    }
  }
});

const App = () => {
  const [light, setLight] = React.useState(true);
  return (
    <ThemeProvider theme={light ? themeLight : themeDark}>
      <CssBaseline />
      <Button onClick={() => setLight((prev) => !prev)}>Toggle Theme</Button>
    </ThemeProvider>
  );
};

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

编辑主题正文背景

原文由 Ryan Cogswell 发布,翻译遵循 CC BY-SA 4.0 许可协议

在@NearHuscarl 的回答之上,在 CSSBaseLine 之后导入 GlobalStyles,将保留页面默认值(如边距:0 等),仍然能够自定义根级/全局样式。例如,

 import { Component } from "react";
import { Button, CssBaseline, GlobalStyles } from "@mui/material";
import { ThemeProvider, createTheme } from "@mui/material/styles";

export class App extends Component {
  render() {
    const theme = createTheme({
      palette: {
        mode: "dark",
        primary: {
          main: "#ff0000",
          contrastText: "#fff",
        },
        secondary: {
          main: green[500],
        },
      },
    });
    return (
      <ThemeProvider theme={theme}>
        <CssBaseline />
        <GlobalStyles
          styles={{
            body: { backgroundColor: "cyan" },
          }}
        />
        <Button color="primary" variant="contained">
          Button
        </Button>
      </ThemeProvider>
    );
  }
}

export default App;

(我只是出于习惯使用 class 组件😂)

带有嵌套主题的完整示例 MUI 主题切换

原文由 Sri Vineeth 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进