Это можно обойти, используя 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/>
, если контекстное меню все еще отображается или находится в режиме наведения. над. Немного громоздко - но это работает.