页面中应用了iframe,使用antd中的Dropdown组件点击iframe区域却无法关闭Dropdown
原因:
目前大多数的 UI 组件库,例如 Element、Ant Design、iView 等都是通过鼠标事件来处理, 直接给 Document 绑定了 click 事件,当 click
事件触发时候,判断点击目标是否包含在绑定元素中,如果不是就执行绑定的函数关闭。但 iframe 中加载的是一个相对独立的 Document,如果直接在父页面中给 Document 绑定 click 事件,点击 iframe 并不会触发该事件。
解决方法:监听当前页window失焦事件,主动控制Dropdown组件的打开与关闭。
代码:
1.自定义hooks
import { useEffect, useState } from 'react';
export default isOpen => {
const [open, setOpen] = useState(isOpen);
useEffect(() => {
window.addEventListener('blur', () => {
setOpen(false);
});
return () => {
window.removeEventListener('blur', () => {
setOpen(false);
});
};
}, []);
return [open, setOpen];
};
2.组件使用:
// 导入自定义hooks使用
const [open, setOpen] = useOpen(false);
// 组件使用
<Dropdown
menu={{
items: [],
onClick: () => {
setOpen(false);
}
}}
trigger={['click']}
placement="bottomLeft"
onOpenChange={flag => {
setOpen(flag);
}}
open={open}
>
<Button
icon={<MenuOutlined/>}
type={'text'}
></Button>
</Dropdown>