【发布时间】:2020-10-10 12:33:51
【问题描述】:
我正在尝试创建一个过滤器下拉菜单,如果用户没有手动关闭它并在 1 秒后将鼠标从过滤器上移开,它会自行隐藏。
问题是mouseInside 布尔状态在区间内永远不会更改为false。我相信这是因为 react 组件被重新渲染但并不完全确定。
我不知道如何修复它,也不知道我如何错误地使用状态变量和局部变量。
我在 React 中使用带有钩子的 TypeScript:
const Filter: React.FC = () => {
const [shown, setShown] = useState<boolean>(false);
const [mouseInside, setMouseInside] = useState<boolean>(false);
let interval: NodeJS.Timeout | null = null;
const handleToggle = () => {
setShown(!shown);
interval = setInterval(() => {
console.log(mouseInside);
// mouseInside is permanently true
if (!mouseInside && interval) {
// this never gets triggered
clearInterval(interval);
setShown(false);
console.log("Finished!");
}
}, 1000);
}
};
return (
<div
style={{ width: 100, height: 100, backgroundColor: "lightgray" }}
onClick={handleToggle}
onMouseEnter={() => setMouseInside(true)}
onMouseLeave={() => setMouseInside(false)}
>
<p>Click me!</p>
{shown && <div>drop down here...</dv>}
</div>
);
};
当用户离开过滤器框时,我需要 mouseInside 最终更改为 false。 onMouseLeave 事件肯定会被触发,但我认为是 React 方面的事情导致了问题。
也许我需要使用useEffect?我不知道如何将其与setInterval 一起使用的最佳方法。
【问题讨论】:
-
你在哪里使用
handleToggle? -
@GalAbra 抱歉。我忘了把它包括在样本中。刚刚添加。
标签: javascript reactjs typescript state setinterval