You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MUI v5中样式化root类及ListItem样式设置无效问题求助

解决MUI v5 ListItem样式设置无效的问题

我来帮你搞定这个ListItem样式不生效的问题!你遇到的问题本质是对MUI v5的sx和styled API的用法理解有偏差,咱们一步步修正:

一、使用sx属性的正确写法

你之前在sx里嵌套root字段是错误的——MUI的sx属性默认就是直接作用于组件的根元素,不需要额外指定root键。如果你的ListItem加了button属性,根元素本身就是一个按钮元素,直接在sx里写样式和伪类即可:

<ListItem 
  button 
  onClick={handleClick} 
  sx={{
    width: "10%",
    "&:hover": {
      textDecoration: "none",
      backgroundColor: "blue",
      "@media (hover: none)": { 
        backgroundColor: "transparent" 
      }
    }
  }}
>
  {/* 内容 */}
</ListItem>

为什么之前的写法无效?

sx是MUI的内联样式增强方案,它的对象直接对应根元素的样式规则,不需要像自定义主题那样通过root这类类名键来嵌套。


二、使用styled组件的正确写法

你之前在styled里用root和button作为对象键是不对的,styled的回调函数需要直接编写CSS规则(或者MUI的样式对象),如果要针对ListItem的button状态样式,需要通过类名选择器来定位:

const MyListItem = styled(ListItem)(({ theme }) => ({
  width: "10%",
  // 当ListItem带有button属性时,根元素会添加.MuiListItem-button类,这样写hover样式
  "&.MuiListItem-button:hover": {
    textDecoration: "none",
    backgroundColor: "blue",
    "@media (hover: none)": {
      backgroundColor: "transparent"
    }
  }
}));

// 使用方式不变
<MyListItem button onClick={handleClick}>
  {/* 内容 */}
</MyListItem>

另一种更简洁的styled写法(针对button属性的情况)

如果你的MyListItem始终会带button属性,也可以直接把样式写在根选择器上,因为此时根元素就是按钮:

const MyListItem = styled(ListItem)({
  width: "10%",
  "&:hover": {
    textDecoration: "none",
    backgroundColor: "blue",
    "@media (hover: none)": {
      backgroundColor: "transparent"
    }
  }
});

总结一下:MUI v5的样式API和v4有不少差异,v4里通过类名键(比如root、button)来定制的方式,在v5的sx和styled里不需要了,直接针对根元素或者目标类名写样式即可~

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:37:48