React Material UI MultiSelect多选组件onClose事件不生效,如何实现选后自动关闭菜单
React Material UI MultiSelect 选中后自动关闭下拉菜单解决方案
Material UI的Select组件默认多选模式下,点击选项不会自动收起下拉,你之前配置的onClose仅会在点击下拉外部、按下ESC键时触发,因此需要手动控制下拉的展开/收起状态。
修改步骤
- 新增状态变量控制下拉菜单的显隐
- 给Select组件绑定
open、onOpen、onClose属性关联该状态 - 在选中值变更回调中,更新完选中数据后手动关闭下拉
修改后完整代码
import React from 'react'; import clsx from 'clsx'; import { makeStyles, useTheme } from '@material-ui/core/styles'; import Input from '@material-ui/core/Input'; import InputLabel from '@material-ui/core/InputLabel'; import MenuItem from '@material-ui/core/MenuItem'; import FormControl from '@material-ui/core/FormControl'; import ListItemText from '@material-ui/core/ListItemText'; import Select from '@material-ui/core/Select'; import Checkbox from '@material-ui/core/Checkbox'; import Chip from '@material-ui/core/Chip'; const useStyles = makeStyles((theme) => ({ formControl: { margin: theme.spacing(1), minWidth: 120, maxWidth: 300, }, chips: { display: 'flex', flexWrap: 'wrap', }, chip: { margin: 2, }, noLabel: { marginTop: theme.spacing(3), }, })); const ITEM_HEIGHT = 48; const ITEM_PADDING_TOP = 8; const MenuProps = { PaperProps: { style: { maxHeight: ITEM_HEIGHT * 4.5 + ITEM_PADDING_TOP, width: 250, }, }, }; const names = [ 'Oliver Hansen', 'Van Henry', 'April Tucker', 'Ralph Hubbard', 'Omar Alexander', 'Carlos Abbott', 'Miriam Wagner', 'Bradley Wilkerson', 'Virginia Andrews', 'Kelly Snyder', ]; function getStyles(name, personName, theme) { return { fontWeight: personName.indexOf(name) === -1 ? theme.typography.fontWeightRegular : theme.typography.fontWeightMedium, }; } export default function MultipleSelect() { const classes = useStyles(); const theme = useTheme(); const [personName, setPersonName] = React.useState([]); // 新增控制下拉显隐的状态 const [open, setOpen] = React.useState(false); const handleChange = (event) => { setPersonName(event.target.value); // 选中后直接关闭下拉 setOpen(false); }; const handleChangeMultiple = (event) => { const { options } = event.target; const value = []; for (let i = 0, l = options.length; i < l; i += 1) { if (options[i].selected) { value.push(options[i].value); } } setPersonName(value); setOpen(false); }; return ( <div> <FormControl className={classes.formControl}> <InputLabel id="demo-mutiple-name-label">Name</InputLabel> <Select labelId="demo-mutiple-name-label" id="demo-mutiple-name" multiple value={personName} onChange={handleChange} input={<Input />} MenuProps={MenuProps} {/* 绑定下拉显隐控制属性 */} open={open} onOpen={() => setOpen(true)} onClose={() => setOpen(false)} > {names.map((name) => ( <MenuItem key={name} value={name} style={getStyles(name, personName, theme)}> {name} </MenuItem> ))} </Select> </FormControl> </div> ); }
内容的提问来源于stack exchange,提问作者deekshitha k
相关产品推荐
相关产品推荐

