英文:
Focusing on Popper activated on MouseOver
问题
我的Popper
在鼠标悬停时激活,并在鼠标移出时停用)。
我的弹出窗口包含一个用户可以点击的链接。
问题是,一旦我移出弹出窗口,它就会消失,我无法找到一种方法让它保持打开,以便用户可以点击链接。
以下是简化的代码:
import "./styles.css";
import React, { useState } from "react";
import { Box, Popper } from "@mui/material";
export default function App() {
const [el, setEl] = useState<(EventTarget & Element) | null>(null);
const [inBox, setBox] = useState(false);
const handle1 = (e: React.MouseEvent) => {
if (inBox) return;
console.log("enter");
setEl(e.currentTarget);
};
const handle2 = () => {
if (inBox) return;
console.log("close");
setEl(null);
};
const open = !!el;
return (
<Box>
<Box
component="div"
sx={{
backgroundColor: "red",
width: "100px",
height: "100px"
}}
onMouseOver={(e) => handle1(e)}
onMouseOut={handle2}
/>
{open && (
<Popper open={open} anchorEl={el} placement="bottom-start">
<Box
sx={{
backgroundColor: "green",
width: "170px",
height: "70px"
}}
onMouseOver={() => {
console.log("ENTERING");
setBox(true);
}}
onMouseOut={() => {
setBox(false);
}}
/>
</Popper>
)}
<Box
onMouseEnter={handle1}
onMouseLeave={handle2}
sx={{
backgroundColor: "blue",
width: "100px",
height: "100px"
}}
/>
</Box>
);
}
英文:
I have a Popper
activated on mouseOver and deactivated on mouseOut).
My popper contains a link for a user to click on.
The problem is that as soon as I move out of the popper, it disappears and I cannot figure out a way to keep it open for a user to click a link.
The simplified code is below:
import "./styles.css";
import React, { useState } from "react";
import { Box, Popper } from "@mui/material";
export default function App() {
const [el, setEl] = useState<(EventTarget & Element) | null>(null);
const [inBox, setBox] = useState(false);
const handle1 = (e: React.MouseEvent) => {
if (inBox) return;
console.log("enter");
setEl(e.currentTarget);
};
const handle2 = () => {
if (inBox) return;
console.log("close");
setEl(null);
};
const open = !!el;
return (
<Box>
<Box
component="div"
sx={{
backgroundColor: "red",
width: "100px",
height: "100px"
}}
onMouseOver={(e) => handle1(e)}
onMouseOut={handle2}
/>
{open && (
<Popper open={open} anchorEl={el} placement="bottom-start">
<Box
sx={{
backgroundColor: "green",
width: "170px",
height: "70px"
}}
onMouseOver={() => {
console.log("ENTERING");
setBox(true);
}}
onMouseOut={() => {
setBox(false);
}}
/>
</Popper>
)}
<Box
onMouseEnter={handle1}
onMouseLeave={handle2}
sx={{
backgroundColor: "blue",
width: "100px",
height: "100px"
}}
/>
</Box>
);
}
答案1
得分: 1
我并没有完全理解你想要的内容。但我猜你想要在鼠标悬停在"Popper"显示框上时显示另一个框,并在鼠标移出时隐藏它,对吗?
import React, { useRef, RefObject, useEffect, useState } from "react";
const Popper = () => {
const divEl1 = useRef<HTMLDivElement>();
const divEl2 = useRef<HTMLDivElement>();
const [isOver, setIsOver] = useState<boolean>(false);
useEffect(() => {
const { current } = divEl1;
if (current) {
current.addEventListener("mouseover", () => setIsOver(true));
current.addEventListener("mouseout", () => setIsOver(false));
return () => {
current.removeEventListener("mouseover", () => setIsOver(true));
current.removeEventListener("mouseout", () => setIsOver(false));
};
}
}, [divEl1]);
return (
<div>
<div ref={divEl1 as RefObject<HTMLDivElement>}>Popper</div>
<div style={{ display: isOver ? "block" : "none" }} ref={divEl2 as RefObject<HTMLDivElement>}>
Show/NotShow
</div>
</div>
);
};
export default Popper;
请注意,我已经添加了"mouseout"事件监听器,并在适当的时候移除了它们,以确保正常工作。
英文:
I didn't perfectly understand what you want. But, I guess you want to do that mouseover at popper show Box & mouseout on Box disappear box? Right?
import React, { useRef, RefObject, useEffect } from "react";
const Popper = () => {
const divEl1 = useRef<HTMLDivElement>();
const divEl2 = useRef<HTMLDivElement>();
const [isOver,setIsOver] = useState<boolean>(false);
useEffect(() => {
const { current } = divEl1;
if(current) {
current.addEventListener("mouseover", () => setIsOver(true));
current.removeEventListener("mouseover", () => setIsOver(true));
}
}, [divEl1]);
useEffect(() => {
const { current } = divEl2;
if(current) {
current.addEventListener("mouseout", () => setIsOver(false));
current.removeEventListener("mouseout", () => setIsOver(false));
}
}, [divEl2]);
return (
<div >
<div ref={divEl1 as RefObject<HTMLDivElement>}>
Popper
</div>
<div style={{display : isOver ? "block" : "none"}} ref={divEl2 as RefObject<HTMLDivElement>}>
Show/NotShow
</div>
</div>
)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论