Material ui 根据选定的主题模式使用调色板原色

IT技术 javascript reactjs material-ui react-material
2021-05-07 04:00:41

在使用 mui react 时,我想使用主题主调色板中的颜色为一些由 div 制作的非材质 ui 自定义组件着色。

我目前可以直接使用theme.palette.primary.main.light颜色,包括theme.palette.text.primaryfor 文本颜色。

但是,如果我将主题更改为暗模式,则还必须通过检查theme.mode以下条件来更改颜色参考

  <div
    style={{
      backgroundColor:
        theme.palette.mode == "light"
          ? theme.palette.primary.dark
          : theme.palette.primary.light
    }}
  >
    Test
  </div>

那么有没有一种方法可以让我们像在材质 ui 组件中一样工作?传递theme.palette.primary将与主题模式更改一起使用吗?

也许更简单的东西,比如:

<div style={{ backgroundColor: theme.palette.primary }}></div>
1个回答

你可以使用上下文来保存你的主题统一设置,你也需要主题分离喜欢lightdark

// SettingsContext.js
import React, {
  createContext,
  useState
} from 'react';

const defaultSettings = {
  // you could add sort of global settings here
  theme: 'light'
};

const SettingsContext = createContext({
  settings: defaultSettings,
  saveSettings: () => {}
});

export const SettingsProvider = ({ settings, children }) => {
  const [currentSettings, setCurrentSettings] = useState(settings || defaultSettings);

  return (
    <SettingsContext.Provider
      value={{
        settings: currentSettings,
      }}
    >
      {children}
    </SettingsContext.Provider>
  );
};

export const SettingsConsumer = SettingsContext.Consumer;

export default SettingsContext;

您可以将设置上下文构建为挂钩,但您可以跳过此步骤。

// useSettings.js
import { useContext } from 'react'; 
import SettingsContext from './SettingsContext';

const useSettings = () => useContext(SettingsContext);

export default useSettings;

然后尝试创建您的自定义主题,其中包括深色和浅色模式。

// theme.js
import { createTheme as createMuiTheme } from '@mui/material/styles';

const themes = {
  'light': {
    ...
  },
  'dark': {
    ...
  }
];

export const createTheme = (name) => {
  return createMuiTheme(themes[name]);
}

之后,您需要传递您在App.jsindex.js任何顶级文件中选择的主题

// App.js
...
import { ThemeProvider } from '@mui/material/styles';
import useSettings from './useSettings';
import { createTheme } from './theme.js';

const App = () => {
  const { settings } = useSettings();

  const theme = createTheme(settings.theme);

  return (
    <ThemeProvider theme={theme}>
      ...
    </ThemeProvider>
  );
};

export default App;
...

就这样。

现在,您可以在组件中使用所选主题而无需条件渲染。

<div style={{ backgroundColor: theme.palette.primary }}></div>

但这不会阻止硬刷新后选择的主题。

因此,如果您想在刷新浏览器后仍保持所选主题,则可以将主题设置保存在localStorage 中