Detecting clicks outside a div and toggle menu

akano1

I have a toggle menu and I'm trying detect the click events outside of a menu to be able to close the menu, I can close the menu when user clicks outside of the menu, however to open the menu again you would have to click on it twice, does anyone know what I have to do to fix that, (the menu should open with one click)

const RightMenu = ({ t, history }) => {
  let [menuOpen, setMenuOpen] = useState(false);

  const menuDiv = useRef({});
  const toggleMenu = useRef();

  useEffect(() => {
    window.addEventListener("click", () => {
      if ((menuDiv.current.style.display = "block")) {
        menuDiv.current.style.display = "none";
      }
    });
    return () => {
      window.removeEventListener("click", () => {});
    };
  }, []);

  const handleClick = e => {
    e.stopPropagation();
    if (menuOpen === false) {
      menuDiv.current.style.display = "block";
      setMenuOpen(true);
    }
    if (menuOpen === true) {
      menuDiv.current.style.display = "none";
      setMenuOpen(false);
    }
  };

  return (
    <div>
      <div
        id="menu"
        ref={menuDiv}
        style={{
          display: "none"
        }}
      >Menu items</div>

      <div
        className="text-center"
        ref={toggleMenu}
        onClick={e => handleClick(e)}
      > Menu Button</div> 
    ) 
}
MiDas
const RightMenu = ({ t, history }) => {
let [menuOpen, setMenuOpen] = useState(false);


 useEffect(() => {
 window.addEventListener("click", () => {
 setMenuOpen(prevState => {
  return !prevState
 })
  });
return () => {
  window.removeEventListener("click", () => {});
};
}, []);

const handleClick = () => {
 e.stopPropagation();
 setMenuOpen(!menuOpen);
};

return (
<div>
  {menuOpen && (<div
    id="menu"

  >Menu items</div>)}

  <div
    className="text-center"

    onClick={handleClick}
  > Menu Button</div> 
) 

You do not need refs to achieve this, u can conditionally render the menu based on the menuOpen state like in the example provided.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

Use jQuery to hide a DIV when the user clicks outside of it

How do I close this checkbox menu after the user clicks on the links or outside of the menu?

Detecting clicks on a button in Swift

Detecting class toggle in jQuery

Detect clicks outside of specific div and all of it's children

Toggle the div with a button and hide the div when click outside of that div

on click outside of a div dropdown menu is hiding but the toggle is not displaying

Menu hiding when outside 'div' element is clicked

Pygame not detecting mouse clicks

Record Clicks on Modal Toggle

How can we close a toggle menu with an outside click

Navigation menu disappears in landscape mode if the user clicks the toggle button in portrait mode in my responsive website

Menu div slideup outside click

Detecting mouse clicks on a gameobject

css horizontal menu is outside of round div layer

jQuery toggle clicks

Toggle div when clicked and hide when clicked outside

Mobiles not detecting anchor change to toggle menu

Mobile menu button 2 clicks to toggle the menu

Place content outside DIV in react when toggle

It is taking the user two clicks to remove a div block with javascript toggle visibility

Toggle menu between two div container

JQuery toggle menu if click outside of it hide()

Toggle close / open div on double click or click outside

detecting pointermove event outside div while pointer is down

Toggle menu if click outside then hide

Directives for Detecting Clicks outside Element

Jquery drop down menu on click - Hide menu when user clicks menu button, clicks outside of menu OR clicks on a new drop

Detecting Clicks on HTML "Date" Input