MUI v5 主题与情感/mui

pic*_*ick 6 javascript typescript reactjs material-ui

我已将 MUI 从 v4 升级到 v5。但是,我现在很难理解主题如何与可用的不同主题解决方案一起使用。我不太明白在哪里使用 MUI 主题/样式组件以及何时使用情感组件。

在新组件中,我使用sxprop 来应用样式,但是我有很多组件仍在使用createStyles/useStyles函数。

我目前有以下设置:

import {
  ThemeProvider as MuiThemeProvider,
  Theme,
  StyledEngineProvider,
  createTheme,
} from "@mui/material/styles";
import { ThemeProvider } from "@emotion/react";

declare module "@mui/material/styles" {
  interface Theme {
    mycompany: {
      primary: string;
    };
  }
  // allow configuration using `createTheme`
  interface ThemeOptions {
    mycompany: {
      primary: string;
    };
  }
}

declare module "@mui/styles/defaultTheme" {
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
  interface DefaultTheme extends Theme {}
}

const theme = createTheme({
  mycompany: {
    primary: "#003366",
  },
});

const App = () => {
  return (
    <StyledEngineProvider injectFirst>
      <MuiThemeProvider theme={theme}>
        <ThemeProvider theme={theme}>
          <Router>
            ...
          </Router>
        </ThemeProvider>
      </MuiThemeProvider>
    </StyledEngineProvider>

Run Code Online (Sandbox Code Playgroud)

我现在如何使用该theme.mycompany.primary值?我已经尝试过这样的:

import { useTheme } from "@emotion/react";

const MyComponent = () => {
    const theme = useTheme();

    return (
      <Box sx={{backgroundColor: theme.mycompany.primary}}>
        ...
      </Box>

Run Code Online (Sandbox Code Playgroud)

是否有任何项目示例使用新的样式解决方案以及跨不同文件中多个组件的打字稿?

Nea*_*arl 9

文档来看,useTheme应该是从 导入的@mui/material/styles

如果您使用sxprop,您应该将自定义颜色代码放入调色板中,如下所示:

const theme = createTheme({
  palette: {
    mycompany: {
      primary: "#003366"
    }
  },
});
Run Code Online (Sandbox Code Playgroud)

并引用组件中的颜色:

<Box sx={{ width: 30, height: 30, bgcolor: "mycompany.primary" }} />
Run Code Online (Sandbox Code Playgroud)

如果您正在使用,styled您可以添加一个回调,其中它theme是第一个参数的属性:

const MyComponent = styled(Box)(({ theme }) => {
  return {
    backgroundColor: theme.palette.mycompany.primary,
    width: 30,
    height: 30
  };
});
Run Code Online (Sandbox Code Playgroud)

现场演示

Codesandbox 演示