Если вы дважды нажмете кнопку, вы не сможете открыть ее снова. Если вы щелкнете за пределами кнопки, чтобы закрыть ее, она будет работать должным образом.
Вероятно, это связано с тем, что ваш обратный вызов showMenu выполняется, даже когда меню уже отображается, что приводит к подключению нескольких слушателей события closeMenu, что в Поворот приводит к странному поведению.
Слушатель события closeMenu должен быть создан внутри эффекта, а не в обратном вызове showMenu.
const showMenu = (event: React.MouseEvent) => {
event.preventDefault()
toggleMenu(true)
}
// closeMenu is the same
const closeMenu = (event: MouseEvent) => {
const el = event.target
if (menuContent.current) {
if (el instanceof Node && !menuContent.current.contains(el)) {
toggleMenu(false)
document.removeEventListener('click', closeMenu)
}
}
}
useEffect(() => {
if (!menuOpen) {
return
}
document.addEventListener('click', closeMenu)
return () => {
document.removeEventListener('click', closeMenu)
}
}, [menuOpen])
useEffect действительно круто - возвращенная функция, в которой слушатель события Удалено будет вызываться как при изменении menuOpen, так и при размонтировании компонента. В предыдущем коде, если компонент был размонтирован, прослушиватель событий не будет удален.