考虑侧栏导航的以下组件结构:
<ListItem button dense component={CustomNavLink} to="/dashboard">
<ListItemIcon>
<DashboardIcon />
</ListItemIcon>
<ListItemText primary="Dashboard" />
</ListItem>
任务是在悬停时或ListItemIcon
变为活动状态时更改ListItemText
和CustomNavLink
外观。
请注意,
CustomNavLink
是扩展的React Router的NavLink
组件 当它与当前路线匹配时,它会应用active
类。
以下有点hacky方式通过classes
属性实现了(简化和简化):
const styles = {
root: {
...
'&.active, &:hover, &.active:hover': {
'& path': {
fill: 'red'
},
'& span': {
color: 'red'
}
}
}
};
(classes
然后应用于ListItem
组件)
这似乎是一种非常糟糕的方式,因为嵌套组件的结构泄漏到父级的样式中......这类似于在“旧”CSS中执行此操作:
div:hover > ul > li > a {
color: red;
}
解决这个问题的惯用Material UI方法是什么?
供参考,这是在
中完成的方式styled-components
:const CustomNavLink = styled(NavLink)` ... &:hover { ${ListItemIcon} { path: { fill: red; } } ${ListItemText} { color: red; } } `;
答案 0 :(得分:3)
在悬停/活动状态下,请尝试使用以下示例更改材料UI ListItem子项
const wrapperStyles = {
parent: {
backgroundColor: 'yellow',
'&:hover $child': {
color: 'red'
}
},
child: {
fontSize: '2em',
padding: 24
}
}
答案 1 :(得分:2)
@Patel Charul扩大了答案。如果您要更改悬停时多个孩子的样式。
const wrapperStyles = {
parent: {
backgroundColor: 'yellow',
'&:hover': {
'& $child1': {
color: 'red'
},
'& $child2': {
color: 'blue'
}
},
child1: {
fontSize: '2em',
padding: 24
},
child2: {
fontSize: '4em',
padding: 28
}
}