我有一个简单的mui
Menu
,其中一个MenuItem
应该呈现另一个React
组件,问题是我的Menu
呈现在另一个文件中,其中定义了close
和handleClick
函数。
问题:组件在单击MenuItem时不呈现。似乎是因为App
组件中的setAnchor(null);
总是将锚设置为null。这是否意味着我需要使用不同的anchor
?如果是,如何使用?
菜单组件代码如下:
interface Props {
handler: Handler;
anchor: HTMLButtonElement | null;
onClose: () => void;
}
const AddDataMenu = ({ handler,anchor, onClose }: Props) => {
const renderDataPopOver = () => {
console.log('this is clicked'); <<<<<<<<<< I can see this function is accessed
<AddDataPopover handler={handler} anchor={anchor} onClose={onClose} />;
};
return (
<div>
<Menu
anchorEl={anchor}
open={Boolean(anchor)}
onClose={onClose}
sx={{ width: 320, maxWidth: '100%' }}
>
<MenuItem onClick={renderDataPopOver}>
<ListItemIcon>
<DataIcon />
</ListItemIcon>
<Typography>item 1</Typography>
</MenuItem>
</Menu>
</div>
);
};
export default AddDataMenu;
这是呈现我的菜单的主要组件。
const App = ({ scope }) => {
const ref = useRef<HTMLButtonElement>(null);
const [anchor, setAnchor] = useState<HTMLButtonElement | null>(null);
const [handler, setHandler] = useState<Handler>();
const close = () => { <<<<<<< this is accessed before MenuItem click
setAnchor(null);
};
const handleClick = () => { <<<<<<< this is accessed before MenuItem click
setAnchor(ref.current);
};
return showAdd && handler ? (
<MessageContainer
message={'test'}
actions={
<Box ml={1}>
<Button ref={ref} color="primary" variant="contained" onClick={handleClick}>
{t('Visualization.chart-initial-states.AddColumns')}
</Button>
<AddDataMenu handler={handler} anchor={anchor} onClose={close} />
</Box>
}
/>
) : (
<DisplayError />
);
};
export default App;
1条答案
按热度按时间34gzjxbg1#
假设目标是在点击
MenuItem
时呈现Menu
旁边的次要Popover
,也许组件确实需要将触发它作为anchorEl
的任何MenuItem
分配给所呈现的Popover
。基本的现场示例:stackblitz(为了简单起见,这个例子和下面的例子省略了原始代码中的
Menu
之外的所有内容)。在
AddDataMenu
中,将AddDataPopover
添加到输出中,其初始值anchorEl
为空,这样它就不会立即呈现。匹配的anchorEl
可以在handleOpen
事件中赋值。这里使用
ref
数组来引用多个MenuItem
,但这是一种可选方法。在
AddDataPopover
中,将anchorEl
连接到Popover
,并在活动MenuItem
旁边设置要呈现的组件的样式。