【发布时间】:2020-01-30 14:58:20
【问题描述】:
我有一个带有自定义 MenuItem 的 Material UI 菜单组件。现在,当打开菜单和子菜单时,我希望能够在单击菜单外部时关闭整个菜单。我仍然需要单击两次,首先关闭子菜单,然后关闭实际菜单。
文档MUI menu 是指使用anchorEl 作为boolean 来确定菜单是否打开,但即使我从自定义菜单项发送关闭回调函数,它也只会在单击时使用handleClose() 自行关闭组件之外。因此,在所附图片中,仅包含 Corporate Finance 的 Container 已关闭,菜单也未关闭。
无法理解,因为anchorEl 在closeFunction 中变为null,核心菜单仍然保持打开状态。尝试使用基于 Modal 组件构建的菜单和 MenuItems 和 Popover。
MenuComponent:
const MoreMenu = ({
userTagData,
onChangeItemName,
selectedTags,
onTagSelected,
onRemoveItem,
data,
item,
}) => {
const [anchorEl, setAnchorEl] = useState(null);
const [subMenuPopUpName, setSubMenuPopUpName] = useState('');
const renderChangeTitlePopUp = () => (
<ChangeTitleContainer
onChangeItemName={onChangeItemName}
closeMenuItem={handleClose}
item={item}
/>
);
const renderAddTagPopUp = () => (
<AddTagContainer
item={item}
userTagData={userTagData}
selectedTags={selectedTags}
onTagSelected={onTagSelected}
/>
);
const renderRemoveItemContainer = () => (
<RemoveItemContainer
item={item}
onRemoveItem={onRemoveItem}
closeMenuItem={handeleClose}
/>
);
const renderDefaultPopup = () => (
<div><p>Standard menu post</p></div>
);
const menuItemPopUpSwitcher = (name) => {
switch (name) {
case ADDTAG:
return renderAddTagPopUp();
case CHANGETITLE:
return renderChangeTitlePopUp();
case REMOVEITEM:
return renderRemoveItemContainer();
default:
return renderDefaultPopup();
}
};
const handleMenuItemClick = (item, event) => {
setAnchorEl(event.currentTarget);
setSubMenuPopUpName(item.title);
setAnchorEl(event.currentTarget);
menuItemPopUpSwitcher(item);
};
const handleClose = () => {
setAnchorEl(null);
};
return (
<Fragment>
<MoreButton
data={data}
handleMenuItemClick={handleMenuItemClick}
/>
<Menu
open={Boolean(anchorEl)}
anchorEl={anchorEl}
onClose={handleClose}
anchorOrigin={{
vertical: 'top',
horizontal: 'left',
}}
transformOrigin={{
vertical: 'top',
horizontal: 'right',
}}
>
{menuItemPopUpSwitcher(subMenuPopUpName)}
</Menu>
</Fragment>
);
};custom
【问题讨论】:
-
如果您可以提供CodeSandbox 重现问题,那么提供帮助会更容易/更快。
-
感谢 @RyanCogswell 我会检查 CodeSandbox,看起来它是测试事物的好方法。
-
@PatrikRikama-Hinnenberg 你解决了吗?我对 MUI 4.8.0 版有同样的问题
-
是的,让我尝试提供示例@radzik。
-
那里,希望示例答案能解释它@radzik。
标签: javascript reactjs material-ui