你可以使用上下文来保存你的主题统一设置,你也需要主题分离喜欢light
和dark
。
// 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.js
或index.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 中。