У меня есть обработчики событий для таких вещей, как onClick или onFocus, и я не могу понять, как использовать тему внутри кода обработчика.Я хочу изменить цвет iconButton и не хочу жестко кодировать цвет, потому что нам нужны компоненты, которые могут быть общего назначения, и в конечном итоге работать с темами, используя совершенно разные цвета.
Пробовал использовать withThemeв дополнение к withStyles, так что я могу получить тему внутри render (), но я не могу получить ее из обработчика, вызванного из этого рендеринга.Попытка передать его, вызвать как пропеллер, объявить константы, основанные на значениях темы в классе (как внутри, так и за пределами рендера), ничего.
Я не знаю, возможно ли это или не встроено,или что.Я надеюсь, что я что-то упустил.
Среда: CodeSandBox, поэтому CreateReactApp.Material-UI плюс React-Select, withStyles и withTheme (воспользуйтесь здесь справкой Theme?).
handleInfoClick = (e) => {
if (this.instructionsContent.current.style.display !== "block") {
this.instructionsContent.current.style.display = "block";
this.instructionsButton.current.style.color = "#f9be00"; //works
} else {
this.instructionsContent.current.style.display = "none";
this.instructionsButton.current.style.color = this.theme.palette.text.disabled; // doesn't work
также попробовал это:
handleSelectFocus = () => {
if (this.state.visited === false) {
this.instructionsContent.current.style.display = "block";
this.instructionsButton.current.style.color = this.activeButtonColor;
this.setState({ visited: true });
}
};
...
render() {
const { theme } = this.props;
...
const activeButtonColor = theme.palette.secondary.main;
Наконец, также попытался использовать классы, которые я могуиспользуйте в render (), но он также не распознает их:
const styles = theme => ({
...
infoButton: {
position: "absolute",
bottom: 0,
left: 0,
marginBottom: 20,
width: 48,
color: theme.palette.text.disabled,
"&:active": {
color: theme.palette.secondary.main
}
},
infoButtonActive: {
position: "absolute",
bottom: 0,
left: 0,
marginBottom: 20,
width: 48,
color: theme.palette.secondary.main
},
....
Надеясь, что один из этих подходов даст мне цвет для моего <IconButton>
- из моей темы:
<div className={classes.infoButtonDiv}>
<IconButton
aria-label="Instructions"
className={classes.infoButton}
buttonRef={this.instructionsButton}
onClick={this.handleInfoClick}
>
<HelpOutline />
</IconButton>
</div>
(в другом файле theme.js, примененном к корневому элементу:
const theme = createMuiTheme({
typography: {
fontFamily: ["Roboto", '"Helvetica Neue"', "Arial", "sans-serif"].join(",")
},
palette: {
primary: {
main: "#00665e"
},
secondary: {
main: "#f9be00"
}
},
overrides: {
LeftNav: {
drawerDiv: {
backgroundColor: "#00665e",
width: 300
}
}
},
direction: "ltr",
typography: {
useNextVariants: true
}
});