可以通过React.useRef()
在元素更改时存储元素的悬停状态并使用延迟函数中的引用来决定要做什么来解决此问题。本质上是这样的:
设置状态、引用和更新引用:
...
const [isGroupHover, setIsGroupHover] = useState(false);
const [isContextMenuHover, setIsContextMenuHover] = useState(false);
const isContextMenuHovereRef = useRef(isContextMenuHover);
const isGroupHoverRef = useRef(isGroupHover);
useEffect(() => {
isContextMenuHovereRef.current = isContextMenuHover;
isGroupHoverRef.current = isGroupHover;
}, [isGroupHover, isContextMenuHover]);
...
拦截<Group/>
'onMouseOut
事件
...
const onMouseOut = (e): void => {
setTimeout(() => {
if (!isContextMenuHovereRef.current) {
setIsGroupHover(false);
}
}, 350);
};
...
一个函数 ( setIsContextMenuHover()
) 通过 prop 传递给上下文菜单组件。这样,上下文菜单可以将它自己的悬停状态传递到链上。
...
<ContextMenu setOnHover={setIsContextMenuHover} />
...
<Group/>
本质上,如果上下文菜单仍然可见或悬停在上面,这可以防止更改的悬停状态。有点笨拙 - 但它有效。