#reactjs #material-ui #theming
#reactjs #material-ui #тематизация
Вопрос:
Я еще не очень глубоко в React…
Панель приложений оформлена в виде кнопки, которая мне не нравится.
Итак, я хочу изменить ее цвета, но также заставить ее работать, переключая светлую и темную схему.
[Редактировать] Я хочу определить собственные цвета для панели приложений (без изменения существующих цветов) и добавить их в светлую / темную тему соответственно, чтобы она автоматически менялась на светлую / темную при переключении тем. [/ Править]
Изменение цветов с помощью ThemeProvider уже не работает:
const theme = createMuiTheme({
palette: {
// type: 'dark'
},
overrides: {
MuiTypography: {
h1: {
fontSize: 24,
fontWeight: "normal"
},
h2: {
fontSize: 22,
fontWeight: "normal"
},
},
MuiAppBar: {
background: 'white',
borderBottom: "1px solid lightGray",
}
},
Однако MuiTypography работает.
(Как я вижу здесь https://material-ui.com/customization/default-theme / в панели приложений нет только типографики.)
Как я могу указать AppBar использовать другие цвета, кроме основного / дополнительного, оставаясь синхронизированным со встроенным механизмом light-dark-theme?
Ответ №1:
Чао, если вы хотите переключить тему (например, с темной темы на светлую), вы могли бы использовать primary
и secondary
цвета (ранее определенные в theme
object).
Итак, давайте возьмем этот пример codesandbox, который я сделал:
-
Я определил 2 цвета в теме:
const Theme = { palette: { primary: { main: "#000000" }, secondary: { main: "#FFFFFF" } } };
В данном случае primary
это наша темная тема, а secondary
— светлая.
-
Я создал тему MUI:
const theme = createMuiTheme(Theme);
-
Я завернул
AppBar
компонент вThemeProvider
сtheme
созданным:<ThemeProvider theme={theme}> <AppBar position="static" color={themeSelected}> .... </AppBar> </ThemeProvider>
Как вы можете видеть на AppBar
компоненте, я ввел переменную состояния в color
props ( themeSelected
).
Что ж, теперь я создал простую тему IconButton
со SwapHoriz
значком , и по щелчку я меняю переменную состояния
themeSelected
:
...
const [themeSelected, setThemeSelected] = useState("primary"); // init as primary color
...
const changeTheme = () => { // function to set state
if (themeSelected === "primary") setThemeSelected("secondary");
else setThemeSelected("primary");
};
...
<IconButton //icon button with onClick handler
className={classes.menuButton}
color="inherit"
aria-label="open drawer"
onClick={() => {
changeTheme();
}}
>
<SwapHoriz />
</IconButton>
Вот и все. Теперь, если вы нажмете SwapHoriz
, вы можете изменить цветовую тему:
Основная цветовая тема
Вторичная цветовая тема
Редактировать
После вашего объяснения я понял, что вам нужны разные цвета для панели приложений, и при смене темы панель приложений должна принимать эти цвета.
В этом случае единственный известный мне способ — переопределить classes
AppBar таким образом:
<AppBar
position="static"
color={themeSelected}
classes={{
colorPrimary: classes.appbarpalette,
colorSecondary: classes.appbarpalette
}}
>
Затем в вашем makeStyles
:
...
appbarpalette: {
"amp;.MuiAppBar-colorPrimary": {
backgroundColor: purple[600] // instead of #000000 for primary now you have purple
},
"amp;.MuiAppBar-colorSecondary": {
backgroundColor: green[600] // instead of #FFFFFF for secondary now you have green
}
}
Я обновил свой пример codesandbox.
Комментарии:
1. Я не совсем понимаю: я хочу определить собственные цвета для панели приложений и добавить их в светлую / темную тему соответственно, чтобы они автоматически менялись при переключении тем.
2. О, я понял. Панель приложений должна иметь свой собственный цвет. Хорошо, позвольте мне изменить свой ответ.
3. @sntrcode Я обновил свой ответ. Я надеюсь, что мы сделали то, что вы просили. Дайте мне знать, если я не понял сути 🙂
4. Выглядит хорошо! React действительно крепкий орешек, и я не могу точно сказать atm, насколько хорошо это соответствует этой справочной ссылке , где мне просто нужно написать pallette:{type: ‘темный’}. Я должен сказать, что React довольно лаконично документирован и для начинающих. Я тоже не знаю, должен ли я отметить ваш ответ решенным, поскольку я надеюсь получить еще несколько ответов завтра. Я уже хотел бы отдать вам должное и действительно ценю вашу помощь!
5. Нет проблем. Это всего лишь мой способ использования Material UI (и я не самый лучший эксперт ;)). Давайте подождем других ответов. Может быть, есть кто-то, кто мог бы научить нас чему-то большему :).