Home > Enterprise >  React Hook Toggle class on window resize
React Hook Toggle class on window resize

Time:01-07

I'm trying to build a simple mobile menu with an event listener that would remove the toggle class 'is-open' whenever the window resizes (on the body, button and menu). Not too confident about the syntax, the toggle seems to work but i can't seem to put the pieces together. Any help would be very kindly appreciated!

import React, {useState, useEffect} from 'react';

function NavigationMobile() {

  const [isOpen, setIsOpen] = useState(false);
  const toggle = () => setIsOpen(!isOpen);
  const [isMobile, setIsMobile] = useState(window.innerWidth < 991);

  useEffect(() => {
    document.body.classList.toggle('is-open', isOpen);
  },[isOpen])

  useEffect(() => {
    window.addEventListener("resize", () => {
      const ismobile = window.innerWidth < 991;
      if (ismobile !== isMobile) setIsMobile(ismobile);
    }, false);
  }, [isMobile]);

  return (
    <Wrapper>

      <button className={`nav-link btn-icon menu ${isOpen ? 'is-open' : ''}`} onClick= {toggle} aria-label="Open Menu">
      </button>

      <div className={`mobile-menu ${isOpen ? 'is-open' : ''}`}>

        <div className="mobile-menu-inner">
       
        </div>

      </div>

    </Wrapper>
  )
}

export default NavigationMobile;


CodePudding user response:

Frosty is correct, this works though:

import React, { Fragment, useState, useEffect } from 'react';

const NavigationMobile = () => {
    const [isOpen, setIsOpen] = useState(false);
    const toggle = () => setIsOpen(!isOpen);
    const [isMobile, setIsMobile] = useState(false);
    useEffect(() => {
        window.addEventListener('resize', () => {
            if (window.innerWidth < 991) {
                setIsMobile(true);
            } else {
                setIsMobile(false);
            }
            console.log(window.innerWidth);
        });
    }, []);

    return (
        <Fragment>
            <button
                className={`nav-link btn-icon menu ${isOpen ? 'is-open' : ''}`}
                onClick={toggle}
            />

            <div className={`mobile-menu ${isOpen ? 'is-open' : ''}`}>
                <div className='mobile-menu-inner' />
            </div>

            {!isMobile && <h1>Not Mobile</h1>}
            {isMobile && <h1>Is Mobile</h1>}
        </Fragment>
    );
};

export default NavigationMobile;
  •  Tags:  
  • Related