Material-UI如何根据select组件的宽度设置MenuItem(popover)的minWidth和maxWidth
Material-UI How to set minWidth and maxWidth of MenuItem (popover) according to the width of the select component
弹出窗口的宽度,准确地说。无论菜单项的文本有多长,我都希望弹出窗口的宽度始终与 select 组件相同。将 autoWidth 设置为 true 或 false 没有帮助。
以下是 select 组件的代码:
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;
如果您希望 Select
的宽度根据最宽菜单项的宽度动态变化,那么解决方案要复杂得多。
菜单默认有自动宽度和高度
菜单根据子 ListItems
调整它的宽度和高度
const useStyles = makeStyles((theme: Theme) =>
createStyles({
listItem:{
maxWidth:150,
minWidth:100,
padding: theme.spacing(2)
}
}),
);
弹出窗口的宽度,准确地说。无论菜单项的文本有多长,我都希望弹出窗口的宽度始终与 select 组件相同。将 autoWidth 设置为 true 或 false 没有帮助。
以下是 select 组件的代码:
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;
如果您希望 Select
的宽度根据最宽菜单项的宽度动态变化,那么解决方案要复杂得多。
菜单默认有自动宽度和高度 菜单根据子 ListItems
调整它的宽度和高度const useStyles = makeStyles((theme: Theme) =>
createStyles({
listItem:{
maxWidth:150,
minWidth:100,
padding: theme.spacing(2)
}
}),
);