我正在使用Material-UI ClickAwayListener组件,并且结合已有的react-router代码。按钮位于<ClickAwayListener> ... </ClickAwayListener>
外面,因此我预期在导航到其他路由之前onClickAway
会触发。但它没有触发。
以下是我的代码复制,以某种程度上展示我的意思
function Component(){
const handleClickAway = () => {
// Do something here
}
return (
<>
<button>
<Link to="/other-route">Click here </Link>
</button>
// Some other element here
<ClickAwayListener onClickAway={handleClickAway}>
<div>
// Content
</div>
</ClickAwayListener>
</>
)
}
如果我点击 <ClickAwayListener>
和 <button>
之外的任何位置,handleClickAway
函数都会被触发。但是,如果我点击包含指向其他路由的链接的 <button>
,它就不会触发。
我尝试查看 ClickAwayListener
的源代码和这个部分,我相信它负责检测点击事件。
React.useEffect(() => {
if (mouseEvent !== false) {
const mappedMouseEvent = mapEventPropToEvent(mouseEvent);
const doc = ownerDocument(nodeRef.current);
doc.addEventListener(mappedMouseEvent, handleClickAway);
return () => {
doc.removeEventListener(mappedMouseEvent, handleClickAway);
};
}
return undefined;
}, [handleClickAway, mouseEvent]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.1/umd/react-dom.production.min.js"></script>
useEffect()
的默认行为)。但是,如果这是情况的话,在任何涉及单击 ClickAwayListener
区域之外的事件卸载组件之前,onClickAway
监听器应该被触发,因为该监听器仍附加到单击事件上。简而言之,我期望的行为如下:
按钮单击 --> 触发
onClickAway
--> 组件卸载 --> 转到新路由 --> 运行useEffect()的清除代码 --> 删除监听器但目前发生的情况是:
按钮单击 --> 组件卸载 --> 转到新路由 --> 运行useEffect()的清除代码 --> 删除监听器
请问为什么会出现这种情况?