Как заставить меню начальной загрузки закрываться по щелчку при использовании NavLinks в маршрутизаторе React?

#reactjs #bootstrap-4 #react-router #navbar

#reactjs #bootstrap-4 #react-маршрутизатор #панель навигации

Вопрос:

У меня есть панель навигации Bootstrap 4 в моем приложении React с использованием React Router, и поэтому вместо <a> элементов у меня есть <NavLink> elements.

Следующий код работает хорошо, за исключением случаев, когда пользователь находится в режиме мобильного просмотра и меню открыто, при нажатии на один из пунктов меню страница переключается, меню не закрывается.

Как я могу заставить меню мобильного просмотра закрываться по щелчку?

Я нашел несколько ответов, которые включают добавление a data-toggle="collapse" к <a> элементам, но это не работает с <NavLink> элементами.

введите описание изображения здесь

         <nav className="navbar navbar-expand-lg navbar-light fixed-top bg-light">
                <a className="navbar-brand" href="#"><NavLink className="nav-link" exact to="/"><span className="appTitle">Onespace</span></NavLink></a>
                <button className="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                    <span className="navbar-toggler-icon"></span>
                </button>

                <div className="collapse navbar-collapse" id="navbarSupportedContent">
                    <ul className="navbar-nav mr-auto">
                        <li className="nav-item">
                            <NavLink className="nav-link" to="/languages">Languages</NavLink>
                        </li>
                        <li className="nav-item">
                            <NavLink className="nav-link" to="/news">News</NavLink>
                        </li>
                        <li className="nav-item">
                            <NavLink className="nav-link" to="/runs">Runs</NavLink>
                        </li>
                    </ul>
                </div>
            </nav>
  

Комментарии:

1. Вы решили это в конце концов? Я сталкиваюсь с той же проблемой. Заранее благодарю вас

Ответ №1:

Я думаю, что у меня была такая же проблема. Что касается меня, я решил это с помощью обходного пути, используя событие onClick для добавления / удаления соответствующих классов для кнопки (гамбургер) и выпадающего меню.

Функция:

   handleCollapse = () => {
    console.log("handleCollapse");
    var nav = document.getElementById("navbarNav");
    var btn = document.getElementById("navbarBtn");
    nav.classList.remove("show");
    btn.classList.add("collapsed");
  };
  

Панель навигации (с уменьшенным содержимым):

 render() {
  return (
    <nav className="navbar navbar-expand-md navbar-light fixed-top">
      <Link className="navbar-brand" to="/index">
        <img src="/x.png" className="d-inline-block align-top" loading="lazy"></img>
        PPlan
      </Link>
      <button
        className="navbar-toggler" id="navbarBtn" type="button" 
        data-target="#navbarNav" data-toggle="collapse" 
        aria-controls="navbarNav" aria-expanded="false"
        aria-label="Toggle navigation"
      >
        <span className="navbar-toggler-icon"></span>
      </button>

      <div className="collapse navbar-collapse" id="navbarNav">
        <div className="navbar-nav mr-auto">
          <NavLink to={/1} className="nav-item nav-link" onClick={this.handleCollapse}>
            User
          </NavLink>
          <NavLink to="/2" className="nav-item nav-link" onClick={this.handleCollapse}>
            PrjPlan
          </NavLink>
        </div>
      </div>
    </nav>
  );
}