.toggle () не работает с Vue Router

1

Элемент Vue "router-view" блокирует один из моих элементов для переключения. Но мне нужен Router для ссылки на другие мои страницы. Любое предложение, почему все элементы переключаются, несмотря на DIV #menu?

Вот что я пытаюсь сделать:

После нажатия кнопки #menu выпадающее меню DIV будет расширяться, а #menu DIV получит класс.extend для удаления границ. По какой-то странной причине он работает, когда я удаляю компонент просмотра маршрутизатора внутри своего App.vue. Но это не вариант.

App.vue

<template>
<div>
    <router-view></router-view>
    <Menu></Menu>
  </div> 
</template>
<script>

import Menu from './Modules/Menus/Menu.vue'; 

export default {
components: {
    Menu
  }
}

</script>
<style>
</style>

Main.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import 'bootstrap/dist/js/bootstrap.min.js';
import './assets/js/global.js';


import App from './components/App.vue'
import About from './components/About.vue'
import Consult from './components/Consult.vue'
import Contact from './components/Contact.vue'
import Customers from './components/Customers.vue'
import Msgpia from './components/Msgpia.vue'
import Dataprotection from './components/Dataprotection.vue'

Vue.use(VueRouter)

const routes = [
  {
     name: 'About',
     path: '/about',
     component: About
 },
 {
     name: 'App',
     path: '/',
     component: App
 },
 {
     name: 'Consult',
     path: '/consult',
     component: Consult
 },
 {
     name: 'Contact',
     path: '/contact',
     component: Contact
 },
 {
     name: 'Customers',
     path: '/customers',
     component: Customers
 },
 {
     name: 'Msgpia',
     path: '/msgpia',
     component: Msgpia
 },
 {
     name: 'Dataprotection',
     path: '/dataprotection',
     component: Dataprotection
 }
];

var router = new VueRouter({
  mode: 'history',
  linkActiveClass: 'active',
  routes: routes
});

new Vue(Vue.util.extend({ router }, App)).$mount('#app')

Menu.vue

<template lang="html">
<div>
    <!-- menu -->
      <div id="menu" class="d-flex flex-row justify-content-center align-items-center" @click="toggleMenu">
          <p class="upperC">Menu</p>
          <div id="burger">
              <div class="bar barTop">
              </div>
              <div class="bar barCenter">
              </div>
              <div class="bar barBottom">
              </div>
          </div>
      </div>
      <div class="dropDown d-flex justify-content-between flex-column bigBorder">
          <div id="menuTopLinks" class="row">
              <div class="col-sm-10 d-flex flex-row justify-content-around">
                  <li @click="toggleMenu"><router-link to='/about'>Über Pial</router-link></li>
                  <li @click="toggleMenu"><router-link to='/customers'>Kunden</router-link></li>
                  <li @click="toggleMenu"><router-link to='/contact'>Kontakt</router-link></li>
              </div>
          </div>
          <div id="menuCenter" class="row">
              <div class="offset-sm-2 col-sm-8 ">
                  <router-link to='/msgpia'><h3 class="borderBottom" @click="toggleMenu">MSG.PIA</h3></router-link>
                  <router-link to='/consult'><h3 class="borderBottom" @click="toggleMenu">Beratungsleistung</h3></router-link>
              </div>
          </div>
          <div id="menuFooter" class="row">
              <div class="offset-sm-1 col-sm-10 d-flex flex-row justify-content-between">
                  <router-link to='/'><p @click="toggleMenu" class="upperC">Startseite</p></router-link>
                  <p @click="toggleMenu" class="upperC"><a @click="openImpressum" class="impressumLink">Impressum</a></p>
                  <p @click="toggleMenu" class="upperC"><router-link to='/dataprotection' class="datenschutzLink">Datenschutz</router-link></p>
              </div>
          </div>
      </div>
      <!-- menu -->
</div>

</template>

<script>


export default {
    methods:{
        // open and closes menu on all other sites
        toggleMenu: function() {
            var menu = document.getElementById('menu');
            var bars = document.querySelectorAll('.bar');
            var dropDown = document.querySelector('.dropDown');

            menu.classList.toggle('extend');
            dropDown.classList.toggle('extend');

            for (var i = 0; i < bars.length; i++) {
                bars[i].classList.toggle('extend');
            }
        },

        openImpressum: function(){
            document.getElementById('impressumOverlay').style.display = 'block';
        },

        openDataprotection: function(){
            document.getElementById('datenSchutzOverlay').style.display = 'block';
        }
    }
}
</script>

<style lang="scss">
@import './src/assets/scss/variables';


#menu {
    clear: both;
    position: fixed;
    top: 50px;
    right: 0;
    width: 178px;
    height: 70px;
    z-index: 900;
    margin-right: 50px;
    background-color: $color-purple;
    border: 8px solid $color-black;
    cursor: pointer;
    -webkit-transition: all 400ms;
    transition: all 400ms;

    &.extend {
        border: none;
        background-color: transparent;
        -webkit-transition: 0.4s;
        transition: 0.4s;
    }

    p {
        margin: 0;
        font-size: 0.7rem;
        font-weight: 600;
        letter-spacing: 0.92px;
        line-height: 20px;
        padding-right: 1rem;
    }

    #burger {
        width: 32px;

        .bar {
            background-color: $color-black;
            height: 4px;
            margin: 4px 0;
            -webkit-transition: 0.4s;
            transition: 0.4s;
        }
        /* Rotate first bar */
        .barTop {
            &.extend {
                -webkit-transform: rotate(-45deg) translate(-6px, 5px);
                transform: rotate(-45deg) translate(-6px, 5px);
            }
        }
        /* Fade out the second bar */
        .barCenter {
            &.extend {
                opacity: 0;
            }
        }
        /* Rotate last bar */
        .barBottom {
            &.extend {
                -webkit-transform: rotate(45deg) translate(-6px, -5px);
                transform: rotate(45deg) translate(-6px, -6px);
            }
        }
    }
}

.dropDown {
    z-index: 150;
    position: fixed;
    top: 24px;
    right: 0;
    margin-right: 50px;
    background-color: $color-purple;
    width: 0;
    height: 0;
    opacity: 0;
    overflow: hidden;
    -webkit-transition: all 400ms;
    transition: all 400ms;

    &.extend {
        opacity: 1;
        width: 70%;
        height: 90%;
    }

    #menuFooter{
        p{
            font-weight: 600;
            line-height: 40px;
            letter-spacing: 1px;
            font-size: 0.7rem;

            &:first-child{
                width: 211px;
                height: 36px;
                text-align: center;
                background-color: $color-black;
                font-size: 1rem;
                color: white;
                font-weight: 600;
                letter-spacing: 1.5px;
            }
        }
    }

    #menuTopLinks {
        margin-top: 42px;

        li {
            list-style: none;

            a {
                text-decoration: none;
                font-size: 1.4rem;
                letter-spacing: 2px;
            }
        }
    }

    #menuCenter {
        h3 {
            font-size: 2rem;
            font-weight: 600;
            letter-spacing: 2px;
            line-height: 24px;
            padding: 2rem 0;
        }
    }
}
</style>
Теги:
vue.js
vue-router
toggle

1 ответ

0

Вы можете использовать @click событий @click и переключать класс, написав метод для этого события. Что-то вроде

<div id="menuTopLinks" class="row" @click="mouseOver">

mouseOver: function () {
    var x = document.getElementById("menuTopLinks")
    if (x) {
        x.classList.toggle("extend")
    }
}
  • 0
    Я уже сделал это с помощью <div id = "menu" class = "d-flex flex-row justify-content-center align-items-center" @ click = "toggleMenu">, но по какой-то причине переключение на этот элемент не выполняется т работа

Ещё вопросы

Сообщество Overcoder
Наверх
Меню