Я пытаюсь создать раскрывающееся меню фильтра, которое скрывается, если пользователь не закрыл его вручную и отодвинул свою мышь от фильтра через 1 секунду.
Проблема в том, что mouseInside
логическое состояние никогда не изменяется на false
внутри интервала. Я считаю, что это связано с тем, что компонент реакции повторно отображается, но не совсем уверен.
Я не знаю, как это исправить или как я могу неправильно использовать состояние и локальные переменные. Я использую TypeScript в React с хуками:
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
определенно запускается, но я думаю, что проблема связана с реакцией.
Может быть, мне нужно использовать useEffect
? Я не знаю лучшего подхода, как использовать это с setInterval
.