Material ui use palette primary color based on selected theme mode(材质UI基于选定的主题模式使用调色板主色)
问题描述
在使用Mui Reaction时,我希望使用主题的主调色板中的颜色为一些使用div制作的非物质UI自定义组件上色。
我目前可以直接使用theme.palette.primary.main
或.light
颜色,包括theme.palette.text.primary
文本颜色。
但是如果我将主题更改为深色模式,我还必须更改颜色参考,方法是选中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>
推荐答案
您可以使用Context全局保存主题设置,还需要分隔主题,如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中。
这篇关于材质UI基于选定的主题模式使用调色板主色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:材质UI基于选定的主题模式使用调色板主色


基础教程推荐
- 响应更改 div 大小保持纵横比 2022-01-01
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- 我什么时候应该在导入时使用方括号 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 悬停时滑动输入并停留几秒钟 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06
- 动态更新多个选择框 2022-01-01
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01
- 在for循环中使用setTimeout 2022-01-01