简体   繁体   English

MUI createTheme 没有正确地将主题传递给 MUI 组件

[英]MUI createTheme is not properly passing theme to MUI components

I have created a theme in the index of my React.JS project using MUI.我使用 MUI 在我的 React.JS 项目的索引中创建了一个主题。 When I try to apply my style to my Appbar the theme does not correctly modify the menu button nor the menu itself.当我尝试将我的样式应用到我的Appbar ,主题没有正确修改菜单按钮和菜单本身。 the button looks generic default and the menu remains white when it should match the color of the Appbar itself.该按钮看起来是通用的默认值,并且菜单在它应该与Appbar本身的颜色匹配时保持白色。

My index.tsx looks as such:我的 index.tsx 看起来是这样的:

import React from "react";
import ReactDOM from "react-dom";
import AppbarTop from "./AppbarTop";
import { Router } from "react-router";
import { createBrowserHistory } from "history";
import AdapterDateFns from "@mui/lab/AdapterDateFns";
import { LocalizationProvider } from "@mui/lab";
import { createTheme } from "@mui/material";
import { ThemeProvider } from "@mui/styles";
import { StyledEngineProvider } from "@mui/material/styles";

const customHistory = createBrowserHistory();

const theme = createTheme({
  palette: {
    primary: {
      main: "#242526"
    },
    secondary: {
      main: "#d975d0"
    },
    text: {
      primary: "#E4E6EB",
      secondary: "#B0B3B8"
    },
    background: {
      default: "#242526",
      paper: "#242526"
    }
  }
});

ReactDOM.render(
  <React.StrictMode>
    <LocalizationProvider dateAdapter={AdapterDateFns}>
      <Router history={customHistory}>
        <ThemeProvider theme={theme}>
          <StyledEngineProvider injectFirst>
            <AppbarTop />
          </StyledEngineProvider>
        </ThemeProvider>
      </Router>
    </LocalizationProvider>
  </React.StrictMode>,
  document.getElementById("root")
);

My appbar.tsx looks like this:我的 appbar.tsx 看起来像这样:

import React from "react";
import {
  AppBar,
  Box,
  Button,
  Container,
  Menu,
  MenuItem,
  Toolbar
} from "@mui/material";
import HomeIcon from "@mui/icons-material/Home";
import { makeStyles } from "@mui/styles";

const useStyles = makeStyles((theme?: any) => ({
  appBar: {
    background: theme.palette.primary.main,
    height: "60px",
    position: "relative"
  }
}));

const AppbarTop: React.FC<{ [key: string]: any }> = () => {
  const classes = useStyles();

  const [anchorEl, setAnchorEl] = React.useState<any>(null);
  const open = Boolean(anchorEl);
  const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
    setAnchorEl(event.currentTarget);
  };
  const handleClose = () => {
    setAnchorEl(null);
  };

  return (
    <>
      <AppBar position="static" className={classes.appBar}>
        <Toolbar>
          <Button
            id="basic-button"
            aria-controls="basic-menu"
            aria-haspopup="true"
            aria-expanded={open ? "true" : undefined}
            onClick={handleClick}
          >
            Dashboard
          </Button>
          <Menu
            id="basic-menu"
            anchorEl={anchorEl}
            open={open}
            onClose={handleClose}
            MenuListProps={{
              "aria-labelledby": "basic-button"
            }}
          >
            <MenuItem onClick={handleClose}>
              <HomeIcon />{" "}
            </MenuItem>
          </Menu>
          {/*test speed dial*/}

          <Container maxWidth="sm"></Container>
          <Box></Box>
        </Toolbar>
      </AppBar>
    </>
  );
};

export default AppbarTop;

Can someone please explain what I am missing?有人可以解释一下我缺少什么吗?

Change this line:改变这一行:

import { ThemeProvider } from "@mui/styles";

To:到:

import { ThemeProvider } from "@mui/material/styles";

Reason: There are 2 ThemeProvider s here原因:这里有 2 个ThemeProvider

  • The one from @mui/styles : This ThemeProvider does send the Theme object down via context, it works fine, you can still access it using the useTheme hook:来自@mui/styles那个:这个ThemeProvider确实通过上下文发送Theme对象,它工作正常,你仍然可以使用useTheme钩子访问它:
const theme = useTheme();

return <Box sx={{ width: 10, height: 10, bgcolor: theme.palette.primary.main }} />
  • The one from @mui/material/styles : This ThemeProvider is a wrapper of the above, but it also injects the theme to the StyledEngineThemeContext.Provider , which allows you to access the theme when using MUI API ( sx prop/ styled() ).来自@mui/material/styles :这个ThemeProvider是上面的包装器,但它也将主题注入到StyledEngineThemeContext.Provider ,这允许您在使用 MUI API 时访问主题( sx prop/ styled() ) . The problem here is that the Button and Menu components uses the style() API under-the-hood so the ThemeProvider needs to be imported from @mui/material/styles to make it work.这里的问题是ButtonMenu组件在ThemeProvider 使用style() API,因此需要从@mui/material/styles导入ThemeProvider以使其工作。
return <Box sx={{ width: 10, height: 10, bgcolor: 'primary.main' }} />

Related answers相关回答

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM