css - Material-UI如何根据select组件的宽度设置MenuItem(popover)的minWidth和maxWidth

标签 css reactjs width material-ui html-select

准确地说,是弹出窗口的宽度。无论菜单项的文本有多长,我都希望弹出窗口的宽度始终与选择组件相同。将 autoWidth 设置为 truefalse 是没有帮助。

以下是选择组件的代码:

import React from 'react';
import { makeStyles } 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 useStyles = makeStyles(theme => ({
  root: {
    display: 'flex',
    flexWrap: 'wrap',
  },
  formControl: {
    margin: theme.spacing(1),
    minWidth: 120,
  },
}));

function SimpleSelect() {
  const classes = useStyles();
  const [values, setValues] = React.useState({
    age: '',
  });

  const inputLabel = React.useRef(null);
  const [labelWidth, setLabelWidth] = React.useState(0);
  React.useEffect(() => {
    setLabelWidth(inputLabel.current.offsetWidth);
  }, []);

  function handleChange(event) {
    setValues(oldValues => ({
      ...oldValues,
      [event.target.name]: event.target.value,
    }));
  }

  return (
    <form className={classes.root} autoComplete="off">
      <FormControl variant="outlined" className={classes.formControl}>
        <InputLabel ref={inputLabel} htmlFor="outlined-age-simple">
          Age
        </InputLabel>
        <Select
          value={values.age}
          onChange={handleChange}
          input={<OutlinedInput labelWidth={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>
  );
}

export default SimpleSelect;

我怎样才能做到这一点?

最佳答案

您可以通过在菜单项上设置与表单控件的宽度相同的显式宽度来实现这一点。

下面是一个例子:

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import InputLabel from "@material-ui/core/InputLabel";
import MuiMenuItem from "@material-ui/core/MenuItem";
import FormControl from "@material-ui/core/FormControl";
import Select from "@material-ui/core/Select";

const selectWidth = 150;

const useStyles = makeStyles(theme => ({
  root: {
    display: "flex",
    flexWrap: "wrap"
  },
  formControl: {
    margin: theme.spacing(1),
    width: selectWidth
  },
  selectEmpty: {
    marginTop: theme.spacing(2)
  }
}));

const useMenuItemStyles = makeStyles(theme => ({
  menuItem: {
    width: selectWidth
  }
}));

function MenuItem(props) {
  const classes = useMenuItemStyles(props);
  return <MuiMenuItem className={classes.menuItem} {...props} />;
}

function SimpleSelect() {
  const classes = useStyles();
  const [values, setValues] = React.useState({
    age: ""
  });

  function handleChange(event) {
    setValues(oldValues => ({
      ...oldValues,
      [event.target.name]: event.target.value
    }));
  }

  return (
    <form className={classes.root} autoComplete="off">
      <FormControl className={classes.formControl}>
        <InputLabel htmlFor="age-simple">Age</InputLabel>
        <Select
          value={values.age}
          onChange={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>
    </form>
  );
}

export default SimpleSelect;

Edit Material demo

如果您希望 Select 的宽度根据最宽的菜单项的宽度动态变化,那么解决方案要复杂得多。

关于css - Material-UI如何根据select组件的宽度设置MenuItem(popover)的minWidth和maxWidth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56503486/

相关文章:

jquery - (jQuery) 如何在可滚动的 div 中的元素在滚动时出现动画?

javascript - Redux中间件的返回值

javascript - 使用 redux 有什么好处?

javascript - 使 Div 适合屏幕但扣除左边距

css - SASS 工作流程,可通过 Grunt 更轻松地进行 CLI 调试

css - 火狐 : Generating icon on :hover:after state? (CSS)

javascript - react 路由器 :I don't want user to directly navigate to pages by typing urls but allow going to pages only using links inside the app.

html - CSS 我可以在较小的屏幕上设置较高的 % 宽度吗?

javascript - 屏幕宽度 + android

html - 'display: block; float: left' 与 'display: inline-block; float: left' 之间的区别?