Как в реакт вешать разный онклик в зависимости от текущего state?

Только начал трогать react и пытаюсь сделать мобильное меню, которое должно открываться и закрываться по клику на кнопку бургера, а также закрываться по клику вне меню.

Для обработки клика вне элемента взял компонент от airbnb OutsideClickHandler, который оборачивает компонент, клик вне которого и отлавливается и дальше передает в state false. А нажатие по бургеру тоглит state. Проблема в том, что лежит вне меню и когда я нажимаю при открытом меню на бургер, то state меняется на false из-за OutsideClickHandler и сразу обратно на true из-за нажатия на бургер.

Я подумал, что можно решить следующим способом: Если state = true (меню открыто), то передавать бургеру onclick функцию, которая делает state = false, а если state = false, то наоборот. Может как-то можно в реакт вешать разный онклик в зависимости от текущего state? Или есть вообще другие более простые решения моей проблемы? Спасибо за любые советы.

компонент Nav (несколько сокращенный)

const Nav = (props) => {

    const [burgerState, setBurgerState] = useState(false);

    const changeBurger = () => {
      setBurgerState(!burgerState);
    };
    
    return (
      <nav className="nav nav--theme-dark">
          <Burger onClick={changeBurger} burgerState={burgerState} />
        <ul className="nav__list">
          <li className="nav__item nav__item--more">
            <a className="nav__link nav__link--drop nav__link--theme-dark">
              {data.additionalName}
            </a>
            <OutsideClickHandler onOutsideClick={() => {setBurgerState(false)}}>
              <div className={cn("nav__drop js-drop", {'is-open' : burgerState === true})}>
                  меню
              </div>
            </OutsideClickHandler>
          </li>
        </ul>
      </nav>
    );
};



Компонент бургер

const Burger = ( {onClick, burgerState} ) => {
  console.log(burgerState)
  return (
    <button className={cn("burger nav__burger", {'is-open' : burgerState === true})} onClick={onClick}>
      <span className="burger__line" />
    </button>
  );
};

  • Вопрос задан
  • 139 просмотров
Решения вопроса 1
1) changeBurger заверните в useCallback
const changeBurger = useCallback(() => {
  setBurgerState(!burgerState);
}, [burgerState]);


2) Судя по доке OutsideClickHandler - есть пропс disabled, который должен помочь
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы