2017-08-29 1 views
0

Ich habe ein Website-Layout mit Bootstrap wie folgt (und es muss so bleiben):VueJS - Subnav-Komponenten außerhalb der Router-Ansicht?

  • Navigations Spalte auf der linken Seite:

    <div class='row'> 
        <div class='col-md-2'> 
        <main-nav-component></main-nav-component> 
        <sub-nav-component></sub-nav-component> <!-- Problem Area --> 
        </div> 
    
        <div class='col-md-10'> 
        <router-view></router-view> <!-- MAIN CONTENT SECTION --> 
        </div> 
    </div> 
    

    Das ist mir zwei Spalten über die gesamte Website gibt

  • A „contents“ Spalte auf der rechten

verschiedenen Seiten (aber nicht alle), die im Hauptinhaltsbereich angezeigt werden (über den router-view) müssen auch ihr eigenes Subnav unterhalb des Hauptnavs anzeigen. Es gibt verschiedene Sub-Navs für verschiedene Seiten und ich kann nicht herausfinden, wie man das in VueJS macht. Irgendwelche Ideen?

Antwort

1

Es gibt ein paar Möglichkeiten, dies zu tun. Am einfachsten ist es, die Subheader-nav-Komponenten in die Komponenten selbst aufzunehmen, aber Sie haben gesagt, dass sich das Obige nicht ändern wird. Stattdessen müssen Sie Daten an die Sub-nav-Komponente übergeben, um sie darüber zu informieren, was gerendert werden soll. Eine Möglichkeit besteht darin, die Route zu verwenden.

Zum Beispiel mussten wir in einer Anwendung ein bestimmtes Subnav für eine Gruppe von Seiten haben. Wir haben eine 'Zone' in Meta deklariert, dann lesen wir in der Header-Komponente die Zone und zeigen das richtige Subnav dafür an.

In dem router.js:

{ 
    path: '/profile/user', 
    name: 'Profile', 
    component: Profile, 
    meta: { zone: 'profile'} 
}, 

Auf der Header-Komponente:

computed: { 
    zone(){ 
     return this.$store.state.route.meta.zone 
    }, 

Und in dem HTML-Code der Header-Komponente:

<profile-nav v-if="zone == 'profile'"></profile-nav> 
+0

Es sieht aus wie du bist Präsentation der 'profile-nav' Komponente nur wenn' zone == profile'. Aber was ist, wenn Sie völlig verschiedene Komponenten präsentieren wollten? Listen Sie einfach eine ganze Reihe von Komponenten in diesem Header-Bereich auf und machen Sie eine ähnliche 'v-if = 'zone == someOtherComponent' für jede Komponente? – Garfonzo

+0

Das hat perfekt funktioniert. Jetzt habe ich auf jedem 'router'-Element ein' meta'-Feld mit dem Namen 'subNavComponent' und gebe ihm den Wert des gewünschten Subnaves wie' building-sub-nav' oder 'contact-sub-nav'. Dann habe ich in meinem 'App.vue'' 'was ein berechneter Wert ist, der entweder den Wert zurückgibt, der in der 'Meta' des Router-Objekts gespeichert ist, oder eine leere Zeichenfolge zurückgibt . Funktioniert genau so, wie ich es mir erhofft hatte! Danke :) – Garfonzo

+0

Weg zu gehen @Garfonzo! Gute Arbeit! –