【问题标题】:Style Mui child component within parent component using CSS modules使用 CSS 模块在父组件中设置 Mui 子组件的样式
【发布时间】:2021-12-27 00:05:40
【问题描述】:

我正在关注these docs,以便在我正在使用的组件(菜单)中设置材质 ui 组件(纸张)的样式。

我正在使用 CSS 模块来设置我的组件的样式(使用 Webpack 作为捆绑器):

// menu.js

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}
        >
          <MenuItem ...>
            <span> Example 1 <span>
          </MenuItem>
        </Menu>
      </div>
  );
}

//styles.module.css


.menu {
  color: white;
}

.menu .MuiPaper-root {
  background-color: red
}

// Also tried : 
.menu .root {
  background-color: red
}

我的目标是让MuiPaper 组件具有给定的背景颜色。 MuiPaper 是来自Menu 组件的组件,但我没有直接使用MuiPaper,因为我只是声明了父级(&lt;Menu&gt;)。

理想情况下,我想使用 .css 文件进行样式设置。我使用 webpack 将我的 css 文件捆绑到模块中。

这是我在浏览器中看到的内容:

注意背景色“红色”是如何没有应用到最后一个屏幕截图上的。

谢谢:)

【问题讨论】:

    标签: javascript css reactjs material-ui styling


    【解决方案1】:

    CSS 模块不能覆盖来自另一个 CSS 模块(或其他地方)的样式。有几种方法可以解决这个问题:

    1. 为.menu 论文添加另一个类,例如.menuPaper,并通过PaperProps 在Menu 组件上添加它:
    .menuPaper {
      background-color: blue;
    }
    
    <Menu
      id="menu-react-component"
      ...
      className={styles.menu}
      PaperProps={{ className: styles.menuPaper }}
    >
    
    
    1. 将:global 选择器添加到您的css 选择器:
    .menu :global .MuiPaper-root {   
        background-color: red; 
    }
    

    CSS 模块通过在 CSS 类名末尾添加唯一 ID 来“修改”CSS 类名。 :global 选择器可用于禁用此功能并保留类名。

    这两种方法的区别在于,如果您的MyMenu 组件中有多个Menu 组件,则使用:global 方法将使MyMenu 内的所有Menu 实例具有相同的背景。使用 PaperProps 方法,只有特定的 Menus 和 PaperProps={{ className: styles.menuPaper }} 才能应用样式。

    css-loaderdocs:https://github.com/webpack-contrib/css-loader#scope

    MUI Menu 文档:https://mui.com/api/menu/#props(另见 Popover 组件)

    【讨论】:

    • 首先,感谢您指出这一点 :) 非常有帮助。确实,我在之前的帖子中是不正确的,我刚刚更新了它。我现在意识到我想要在这里使用的是 CSS 模块(不是纯 CSS)。我仍然有点不确定如何设置MuiPaper-root 的样式,这是我的&lt;Menu&gt; 的子元素。对此的任何指导将不胜感激:)
    • @Rose 应该像将styles.css 重命名为styles.module.css 一样简单。
    • @Rose 我明白了。 CSS 模块不能覆盖来自另一个 CSS 模块(或其他地方)的样式。在模块中定义的任何样式都会通过在类名末尾添加一个随机 id 来“修改”,当您将样式导入 .js 文件时会应用该随机 id。但是,:global 选择器不会发生这种情况,只有本地类才会发生这种情况。我实际上并没有意识到你可以在 :global 之前放置一个本地选择器,但它似乎是预期的行为,所以我会说去吧!
    • 否则我会说“MUI 方式”来执行此操作是为.menu 论文添加另一个类,例如.menuPaper,然后将PaperProps={{ className: styles.menuPaper }} 添加到Menu组件-这里的区别在于,如果您的MyMenu 组件中有多个Menu 组件,则使用您的:global 方法MyMenu 中的所有菜单将具有相同的背景,而MUI 方法只有特定的Menus 和 PaperProps={{ className: styles.menuPaper }} 将应用样式。
    • 感谢您提出替代方案,我很感激。不幸的是,最后一个解决方案对我不起作用(虽然不完全确定为什么)。 .menu :global .MuiPaper-root 是唯一应用颜色的东西。我用谷歌搜索了很多例子,但我看到很多例子都使用makeStyles,目前似乎已被弃用。
    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 2016-07-31
    • 2021-09-19
    • 2018-12-24
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多