Панель навигации (мобильная версия) не закрывается после щелчка - Vuejs

Когда я нажимаю ссылку на навигационной панели, она не разрушается. Vue версии 2.6.10.

    <template>
  <div class="nav-wrapper">
    <nav>
      <ul>
        <li v-for="(route, index) in routings" :key="index">
          <router-link :to="route.url">{{route.name}}</router-link>
        </li>
        <li>
          <a href="https://blog.inquest.io/" target="_blank">Blog</a>
        </li>
        <li class="visible-xs">
          <Button v-if="!isLoggedIn" :label="loginButtonLabel" :isFilled="true" :action="goToLogin"/>
          <UserWidget v-else :email="setFirstName" :title="'administrator'" :isUserMenu="true" :action="gotoDashboard"/>
        </li>
      </ul>
    </nav>
  </div>
</template>

Это панель навигации, о которой я говорю

Это заголовочная часть кода. При щелчке по классу значка гамбургера «mobile-menu-wrapper visible-xs» он изменится на «mobile-menu-wrapper visible-xs extended». Я думаю, что это будет переход на предыдущий класс, который решит эту проблему. Посоветуйте, пожалуйста, найти проблему.

 <template>
      <div class="header-wrapper">
        <div class="header-container container">
          <Logo/>
          <Nav class="hidden-xs" :routings="routings"/>
          <Button v-if="!isLoggedIn" class="hidden-xs" :label="isLoggedIn ? 'Console' : 'Login / Sign-up'" :isFilled="true" :action="goToLogin"/>
          <UserWidget class="hidden-xs" v-if="isLoggedIn" :email="setFirstName" :title="'administrator'" :isUserMenu="true" :action="gotoDashboard"/>
          <div class="mobile-menu-icon-wrapper visible-xs" @click="getMobileMenu">
            <i v-if="isMenuExpanded" class="mobile-menu-icon close-icon"></i>
            <i v-if="!isMenuExpanded" class="mobile-menu-icon expand-icons"></i>
          </div>
          <div class="mobile-menu-wrapper visible-xs" :class="{'expanded': isMenuExpanded}">
            <div class="menu-overlay" @click="getMobileMenu"></div>
            <Nav :routings="routings" :eventBus="eventBus" :adminDetails="adminDetails" :isLoggedIn="isLoggedIn"/>
            <div class="mobile-menu-icon-wrapper" @click="getMobileMenu">
              <i v-if="isMenuExpanded" class="mobile-menu-icon close-icon"></i>
            </div>
          </div>
        </div>
      </div>
    </template>

person dglumesh    schedule 04.07.2020    source источник
comment
Пожалуйста, поделитесь своим тегом скрипта, включая свойства данных и методов   -  person Andres Foronda    schedule 04.07.2020
comment
Лучший способ легко поделиться своим кодом - добавить четыре пробела в файлы vscode, а затем скопировать и вставить их сюда.   -  person Andres Foronda    schedule 04.07.2020


Ответы (1)


Попробуйте добавить событие onclick в ссылку вашего маршрутизатора, чтобы закрыть панель навигации, я не вижу код, который вы используете для открытия / закрытия навигации, но вы можете создать такое событие:

Давайте послушаем событие closeNav в родительском компоненте, добавив @closeNav в компонент Nav:

<template>
  <div class="header-wrapper">
    <div class="header-container container">
      <Logo/>
      <Nav class="hidden-xs" :routings="routings"/>
      <Button v-if="!isLoggedIn" class="hidden-xs" :label="isLoggedIn ? 'Console' : 'Login / Sign-up'" :isFilled="true" :action="goToLogin"/>
      <UserWidget class="hidden-xs" v-if="isLoggedIn" :email="setFirstName" :title="'administrator'" :isUserMenu="true" :action="gotoDashboard"/>
      <div class="mobile-menu-icon-wrapper visible-xs" @click="getMobileMenu">
        <i v-if="isMenuExpanded" class="mobile-menu-icon close-icon"></i>
        <i v-if="!isMenuExpanded" class="mobile-menu-icon expand-icons"></i>
      </div>
      <div class="mobile-menu-wrapper visible-xs" :class="{'expanded': isMenuExpanded}">
        <div class="menu-overlay" @click="getMobileMenu"></div>
        
        <!-- here is part of the magic -->
        <!-- alternative one, update isMenuExpanded directly -->
        <Nav :routings="routings" :eventBus="eventBus" :adminDetails="adminDetails" :isLoggedIn="isLoggedIn" @closeNav="isMenuExpanded = false"/>

        <!-- alternative two, update isMenuExpanded using the closeNavBar method -->
        <!--<Nav :routings="routings" :eventBus="eventBus" :adminDetails="adminDetails" :isLoggedIn="isLoggedIn" @closeNav="closeNavBar"/> -->
        
        <div class="mobile-menu-icon-wrapper" @click="getMobileMenu">
          <i v-if="isMenuExpanded" class="mobile-menu-icon close-icon"></i>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  ...
  methods: {
    // alternative using method
    closeNavBar() {
      this.isMenuExpanded = false;
    }
  }
  ...
}
</script>

Компонент панели навигации будет генерировать событие, как только пользователь щелкнет любую ссылку маршрутизатора (вы можете добавить событие в любую другую ссылку или кнопку).

<template>
  <div class="nav-wrapper">
    <nav>
      <ul>
        <li v-for="(route, index) in routings" :key="index">

          <!-- emit the event to close the navBar -->
          <!-- emit directly in the tag -->
          <router-link :to="route.url" @click="$emit('closeNav')">{{route.name}}</router-link>

          <!-- emit by using a method -->
          <!--<router-link :to="route.url" @click="closeNavBarFromChild">{{route.name}}</router-link>-->
        </li>
        <li>
          <a href="https://blog.inquest.io/" target="_blank">Blog</a>
        </li>
        <li class="visible-xs">
          <Button v-if="!isLoggedIn" :label="loginButtonLabel" :isFilled="true" :action="goToLogin"/>
          <UserWidget v-else :email="setFirstName" :title="'administrator'" :isUserMenu="true" :action="gotoDashboard"/>
        </li>
      </ul>
    </nav>
  </div>
</template>
<script>
  ...
  methods: {
    closeNavBarFromChild() {
      this.$emit('closeNav') // Emit the event that the parent is listening
    }
  }
  ...
</script>

Я написал два способа использования событий, но они имеют одинаковый эффект.

person Andres Foronda    schedule 04.07.2020
comment
Спасибо за ваш комментарий. Если я использую модель, как вы, упомяните, как я "navBarModel" делаю "истинным", когда щелкаю значок гамбургера? Я включаю весь код, который использую для навигационной панели. какой код вам нужен для дополнительных разъяснений? - person dglumesh; 04.07.2020
comment
Добро пожаловать, я хочу увидеть весь код, включая кнопку гамбургера, чтобы я мог показать вам, как сделать 'navBarModel' ложным - person Andres Foronda; 04.07.2020
comment
Ваш подход прекрасен. Я думаю, что-то не так. Он не запускает указанный вами метод. Ставлю отладчик внутрь метода и проверяю. Не попадает. Я постараюсь решить это - person dglumesh; 04.07.2020
comment
Не могли бы вы загрузить свой проект в jsfiddle или codeandbox? - person Andres Foronda; 04.07.2020
comment
конечно, я загружу его и поставлю ссылку здесь - person dglumesh; 06.07.2020
comment
Я его загрузил. вы можете проверить это и предложить решение? - person dglumesh; 06.07.2020
comment
Привет, я проверил код codeandbox, но вам не хватает некоторых компонентов и информации о маршрутизаторе, вы импортируете компонент заголовка и передаете ему свойства, которые не существуют, а также импортируете компонент Logo, которого нет в компонентах папка или любая другая папка, то же самое для пользовательского виджета, поэтому код не работает должным образом - person Andres Foronda; 07.07.2020
comment
Я нашел ошибку. Ваш код полностью верен. Необходимо повторно исправить @ click = $ emit ('closeNav') на @ click.native = $ emit ('closeNav'). Спасибо вам большое за вашу поддержку. :) - person dglumesh; 07.07.2020