【问题标题】:Style the dropdown element of MUI Select为 MUI Select 的下拉元素设置样式
【发布时间】:2018-10-25 11:49:15
【问题描述】:

我正在尝试自定义 MUI Select 组件的下拉元素的设计(边框、半径边框)。

MUI 文档提到了各种属性来覆盖和设置各种子组件的样式,但下拉列表本身没有。原因可能是下拉菜单从根组件渲染出来,位置相对于页面是绝对的。

知道如何设置下拉菜单的样式吗? 这是组件当前状态的截图:

我能够自定义 MUI Select 组件的输入元素的设计

【问题讨论】:

  • 最好的办法是阅读源代码而不是他们的文档,文档很好,但代码更清晰。
  • 我建议克隆整个存储库并将提交设置为您的包版本,然后您应该很容易找到如何自定义样式对象。
  • 阅读源代码是个好主意。为这样的东西分叉和更改存储库,不是那么多。

标签: reactjs material-ui


【解决方案1】:

您可以使用 MUI v5 中的sx 属性来设置Paper 的样式,其中包含MenuItem 的列表,如下所示:

<Select
  fullWidth
  value={age}
  onChange={handleChange}
  MenuProps={{
    PaperProps: {
      sx: {
        bgcolor: 'pink',
        '& .MuiMenuItem-root': {
          padding: 2,
        },
      },
    },
  }}
>

现场演示

【讨论】:

    【解决方案2】:

    Material-UI v4

    您可以通过两种不同的方式做到这一点:

    1。全球层面

    这样应用程序中的所有菜单都会获得样式。

    首先你需要创建一个theme.js 文件:

    'use strict';
    
    import { createMuiTheme } from '@material-ui/core/styles';
    
    const theme = createMuiTheme({
        overrides: {
            // Applied to the <ul> element
            MuiMenu: {
                list: {
                    backgroundColor: "#cccccc",
                },
            },
            // Applied to the <li> elements
            MuiMenuItem: {
                root: {
                    fontSize: 12,
                },
            },
        },
    });
    
    export default theme;
    

    然后在你的主应用组件中导入它,这样它就会应用到所有应用组件中:

    'use strict';
    
    import React from "react";
    import { ThemeProvider } from '@material-ui/styles';
    import CssBaseline from '@material-ui/core/CssBaseline';
    import theme from 'theme.js';
    
    export default class App extends React.Component {
    
        render() {
            return (
                <ThemeProvider theme={theme}>
                    <CssBaseline />
                        {/* Your app content */}
                </ThemeProvider>
            );
        }
    }
    

    2。在组件级别

    通过这种方法,您可以为每个组件定义不同的菜单样式。

    'use strict';
    
    import React from "react";
    import { makeStyles } from '@material-ui/core/styles';
    import Select from "@material-ui/core/Select";
    
    const useStyles = makeStyles({
        select: {
            "& ul": {
                backgroundColor: "#cccccc",
            },
            "& li": {
                fontSize: 12,
            },
        },
    });
    
    export default class MyComponent extends React.Component {
    
        const classes = useStyles();
    
        render() {
            return (
                <Select MenuProps={{ classes: { paper: classes.select } }} />
            );
        }
    
    }
    

    【讨论】:

    • 我没有一年前的确切环境,但我单独尝试了这个,哇,它就像一个魅力。谢谢@luca-fagioli!我希望它也能帮助像我这样的人。
    • 您能在此处添加更多详细信息吗?组件级解决方案必须缺少详细信息,因为我收到未定义类的错误。我还尝试了您的全球解决方案,但没有效果。也许我错过了什么......
    • @Mideus 我添加了一个更详尽的示例,其中包含更多详细信息。希望它足以让您发挥作用。
    • 谢谢,成功了!但是,我还需要设置主控件的样式,而不仅仅是菜单/项目。有任何想法吗?我需要更改边框颜色。这是我的代码:&lt;FormControl variant="outlined"&gt;&lt;InputLabel id="id"&gt;Parent&lt;/InputLabel&gt;&lt;Select labelId="id" name="PID" label="Parent" value={pid}&gt;{...MenuItems}&lt;/Select&gt;&lt;/FormControl&gt;
    • 经过数小时的搜索终于
    【解决方案3】:

    适用于 Material-ui 版本 0

    Select Properties 所述,将样式应用于 dropdownMenuprops

    const dropdownMenuProps={
      menuStyle:{
        border: "1px solid black",
        borderRadius: "5%",
        backgroundColor: 'lightgrey',
      },
    }
    使用 dropdownmenuprops 应用要选择的样式

    <SelectField
            multiple={true}
            hintText="Overriden"
            value={values}
            onChange={this.handleChange}
            dropDownMenuProps={dropdownMenuProps}
          >
          
    SandBox Demo using version 0.18

    适用于 Material-ui 版本 1

    使用 MenuProps 属性覆盖下拉或菜单样式。

    Select-API

    试试这个

    const styles = theme => ({
        dropdownStyle: 
        {
          border: "1px solid black",
          borderRadius: "5%",
          backgroundColor:'lightgrey',
        },
    });

    将样式应用到 MenuProps

     <Select
                value={this.state.age}
                onChange={this.handleChange}
                inputProps={{
                  name: "age",
                  id: "age-simple"
                }}
                MenuProps={{ classes: { paper: classes.dropdownStyle } }}
              >

    我在codeandbox中试过这个,它对我有用

    Code Sandbox Demo

    阅读MenuSelect的API了解更多详情。

    【讨论】:

    • 抱歉,我没有使用测试版。
    • 这不起作用drive.google.com/open?id=1VlPxH04n7qdLo7WmNkX9owrELNK5CMIA。 box-shadow 是父 div 的一个属性,似乎没有任何 api 来定位那个 div 的样式。
    • 菜单道具!谢谢,如果可以的话,我会投票 10 次。
    • 很高兴它有帮助。 :)
    • @anonymous_siva 我正在尝试解决类似的问题。虽然我想进一步扩展这个解决方案。通过更新paper 的样式,我能够修复下拉元素的外部内容。我要定位的下一个目标是封装li/MenuItemsul。我就是想不出办法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    相关资源
    最近更新 更多