如何自定义选择下拉MUI纸CSS

时间:2019-03-25 09:49:52

标签: reactjs material-ui formik

我将Material UI用于我的react项目,并使用Material UI文档中显示的选择下拉列表。单击第一组选择下拉菜单后,将弹出“材质用户界面”纸张,其中的选项与选择元素本身重叠。如何将弹出窗口置于select元素下方一点,以使其不会与自定义主题重叠?

import React from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
import { withStyles } from '@material-ui/core/styles';
import OutlinedInput from '@material-ui/core/OutlinedInput';
import InputLabel from '@material-ui/core/InputLabel';
import MenuItem from '@material-ui/core/MenuItem';
import FormControl from '@material-ui/core/FormControl';
import Select from '@material-ui/core/Select';

const styles = theme => ({
  root: {
    display: 'flex',
    flexWrap: 'wrap',
  },
  formControl: {
    margin: theme.spacing.unit,
    minWidth: 120,
  },
});

class SimpleSelect extends React.Component {
  state = {
    age: '',
    labelWidth: 0,
  };

  componentDidMount() {
    this.setState({
      labelWidth: ReactDOM.findDOMNode(this.InputLabelRef).offsetWidth,
    });
  }

  handleChange = event => {
    this.setState({ [event.target.name]: event.target.value });
  };

  render() {
    const { classes } = this.props;

    return (
      <form className={classes.root} autoComplete="off">
        <FormControl className={classes.formControl}>
          <InputLabel htmlFor="age-simple">Age</InputLabel>
          <Select
            value={this.state.age}
            onChange={this.handleChange}
            inputProps={{
              name: 'age',
              id: 'age-simple',
            }}
          >
            <MenuItem value="">
              <em>None</em>
            </MenuItem>
            <MenuItem value={10}>Ten</MenuItem>
            <MenuItem value={20}>Twenty</MenuItem>
            <MenuItem value={30}>Thirty</MenuItem>
          </Select>
        </FormControl>




        <FormControl variant="outlined" className={classes.formControl}>
          <InputLabel
            ref={ref => {
              this.InputLabelRef = ref;
            }}
            htmlFor="outlined-age-simple"
          >
            Age
          </InputLabel>
          <Select
            value={this.state.age}
            onChange={this.handleChange}
            input={
              <OutlinedInput
                labelWidth={this.state.labelWidth}
                name="age"
                id="outlined-age-simple"
              />
            }
          >
            <MenuItem value="">
              <em>None</em>
            </MenuItem>
            <MenuItem value={10}>Ten</MenuItem>
            <MenuItem value={20}>Twenty</MenuItem>
            <MenuItem value={30}>Thirty</MenuItem>
          </Select>
        </FormControl>

      </form>
    );
  }
}

SimpleSelect.propTypes = {
  classes: PropTypes.object.isRequired,
};

export default withStyles(styles)(SimpleSelect);

2 个答案:

答案 0 :(得分:2)

MenuProps有一个名为Select的属性。在MenuProps中将变体设置为menu,然后根据需要调整CSS。

<Select
          classes={{
            root: classes.root,
          }}
          MenuProps={{ classes: { paper: classes.dropdownStyle },
          variant: 'menu' 
          //setting variant to menu makes it appear below the element
        }}
          onChange={()=>{}}
          {...rest}
        >
          {list.map(item => (
            <MenuItem value={item.value}>
              <Typography variant="body2" color="textSecondary">
                {item.label}
              </Typography>
            </MenuItem>
          ))}
        </Select>

答案 1 :(得分:0)

目前没有任何简便的方法可以做到这一点。您所指的外观是“exposed dropdown”变体。我们talked about将来会对此提供支持,但是要我进行研究还需要几个月的时间。

也许可以通过指定内容锚元素和Popover相对于它的位置来实现,但是如果不对Material-UI进行增强,要使其在不同情况下正常工作将很困难。

一种选择是使用“本机”选择(​​https://material-ui.com/demos/selects/#native-select),但这导致选项的外观非常不同,而定制的可能性很小。