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

如何使用CSS Modules为MUI父组件Menu内的子组件Paper设置样式

你的样式不生效核心原因是 Menu 组件内部的 Paper 元素是通过 Popper 组件默认挂载到 document.body 节点下的,和你添加了 styles.menu 类名的 Menu 组件根 DOM 节点不存在父子嵌套关系,你写的 .menu .MuiPaper-root 后代选择器无法匹配到目标元素。

解决方案

方案1:通过 Menu 暴露的 PaperProps 直接传递样式类(最推荐)

Menu 组件官方提供了 PaperProps 属性,可直接把自定义类名传给内部渲染的 Paper 组件,无需用后代选择器。
修改代码如下:

import React from 'react';
import { StyledEngineProvider } from '@mui/material/styles';
...
import styles from './styles.module.css';
import Menu from '@mui/material/Menu';
import MenuItem from '@mui/material/MenuItem';


const MyMenu = (props) => {
  ...
  return (
    <StyledEngineProvider injectFirst>
      <div id="my-menu">
        <Button id="button-react-component" onClick={handleClick}>
          My Menu
        </Button>
        <Menu
          id="menu-react-component"
          ...
          className={styles.menu}
          // 新增PaperProps配置,给内部Paper传自定义类名
          PaperProps={{
            className: styles.menuPaper
          }}
        >
          <MenuItem ...>
            <span> Example 1 <span>
          </MenuItem>
        </Menu>
      </div>
  );
}

styles.module.css 修改部分

.menu {
  color: white;
}

/* 直接定义Paper的样式即可 */
.menuPaper {
  background-color: red;
}

方案2:修改 Popper 挂载容器,让后代选择器生效

如果你坚持要用后代选择器的写法,可以修改 Menu 内部 Popper 的挂载节点,把它挂载到你当前组件的 DOM 节点内,让嵌套结构符合选择器要求:

const MyMenu = (props) => {
  // 新增ref绑定当前组件的容器元素
  const containerRef = React.useRef(null);
  ...
  return (
    <StyledEngineProvider injectFirst>
      {/* 给外层div绑定ref */}
      <div id="my-menu" ref={containerRef}>
        <Button id="button-react-component" onClick={handleClick}>
          My Menu
        </Button>
        <Menu
          id="menu-react-component"
          ...
          className={styles.menu}
          // 新增container配置,指定Popper挂载节点
          container={containerRef.current}
        >
          <MenuItem ...>
            <span> Example 1 <span>
          </MenuItem>
        </Menu>
      </div>
  );
}

修改后你原来写的 .menu .MuiPaper-root 选择器就可以正常匹配到元素,如果遇到样式优先级不够的问题,可以给样式添加 !important 临时提升优先级。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:36:09