javascript - 超时功能中的条件不起作用
问题描述
我有以下代码,我试图在用鼠标悬停在 div 上时增加它的高度。我想设置一个超时时间,以便在取消悬停时延迟关闭。为了避免当鼠标回到它上面时 div 关闭,我创建了 mouseon 状态,它正在相应地调整,但由于某种原因,它似乎没有在超时功能中调整。为什么?
function Component (props) {
const [large, setLarge] = useState(false);
const [mouseon, setMouseon] = useState()
const handleMouseEnter = () => {
document.getElementById(`medium`).style.height = '800px';
setLarge(true);
setMouseon(true)
}
const handleMouseLeave = () => {
setMouseon(false);
setTimeout(()=>{
if(!mouseon){
document.getElementById(`medium`).style.height = '0px';
setLarge(false);
}
}, 1000);
}
return (<>
<div id={`medium`}>
Something something text
{mouseon ? "mouseon" : 0}
</div>
</>
)
}
解决方案
这是因为当你调用 setTimeout 时你的鼠标状态没有改变。您可以使用 useEffect 检查状态 mouseon 是否已更改并调用 setTimeout。
const handleMouseLeave = () => {
setMouseon(false);
};
useEffect(() => {
setTimeout(() => {
if (!mouseon) {
document.getElementById(`medium`).style.height = "0px";
setLarge(false);
}
}, 1000);
}, [mouseon]);
推荐阅读
- eclipse - Eclipse 没有正确显示项目
- node.js - 无法在 Nodejs 中使用 PayUMoney 支付网关
- java - 带有 XmlAdapter 的 JAXB @XmlAnyElement 不会调用解组方法
- javascript - 如何使用 discord Oauth2 在网站上显示用户名?
- reactjs - 无法从 Next js Api Route 获取数据
- java - 如何使用标准构建器为内部连接编写子查询并读取多选中的计数
- c# - 为什么这个 IQueryable 问题会给我一个错误?
- javascript - 如何将滑动切换按钮添加到制表符列中的每个单元格
- firebase - 可以存储在firebase上的最大数值是多少?
- c - C 标准的哪些部分证明了整数类型大小之间的关系?