J'ai une application de page unique Vue.js où il y a une barre de navigation principale qui utilise <router-view/>
pour afficher différentes pages.
Quelque chose comme ça:
<main-header/> <!-- navigation links -->
<transition name="slide-fade" mode="out-in">
<router-view/> <!-- different pages -->
</transition>
Dans l'une de ces pages, j'ai une barre latérale qui contient plus de liens de navigation (qui utilisent <router-link/>
tout comme la barre de navigation principale.
Quelque chose comme ça:
<sidebar/> <!-- navigation links -->
<div class="content">
<transition name="slide-fade" mode="out-in">
<router-view/> <!-- content beside the sidebar -->
</transition>
</div>
Lorsque je clique sur les liens de navigation de la barre latérale, je souhaite que le contenu à côté de la barre latérale change ainsi que l'URL. Cependant, je perds la barre latérale et j'obtiens simplement le composant à rendre dans la section de contenu.
Comment obtenir le résultat souhaité? Comment utiliser plusieurs <router-view/>
s dont l'un est à l'intérieur d'un autre composant, comme l'exemple ci-dessus?
La raison pour laquelle la barre latérale a disparu est que tous les composants sont rendus dans le premier <router-view>
outre le <main-header>
.
Vous devez utiliser le routeur imbriqué en configurant children
dans le routeur de la barre latérale comme:
const router = new VueRouter({
routes: [
{ path: '/your-sidebar-url', component: your-sidebar-page,
children: [
{
// A will be rendered in the second <router-view>
// when /your-sidebar-url/a is matched
path: 'a',
component: A
},
{
// B will be rendered in the second <router-view>
// when /your-sidebar-url/b is matched
path: 'b',
component: B
}
]
}
]
})
Plus d'informations dans routes imbriquées
Vous devez utiliser named views
. Fournissez l'attribut name
à la vue.
<router-view class="view one"></router-view>
<router-view class="view two" name="a"></router-view>
Et les configurer comme
const router = new VueRouter({
routes: [
{
path: '/',
components: {
default: Foo,
a: Bar
}
}
]
})
Veuillez vous référer aux documents officiels .
La réponse @adoug m'a aidé.
Mais dans mon cas, j'avais nommé les deux routeurs:
J'ai fait cela pour le réparer:
<router-view name='a'/>
<router-view name='b'/>
You have <router-view name='a'/>, somewhere inside you
'FatherComponent.vue' mounted in 'a' you have a
second <router-view name='b'/>
Je l'ai fait, pour le réparer:
const router = new VueRouter({
routes: [
{ path: '/your-sidebar-url',
components: {
a: FatherComponent //you sidebar main component in 'a' name of routed-view
},
children: [
{
// A will be rendered in the second <router-view>
// when /your-sidebar-url/a is matched
path: '/child-path/a',
components: {
b: ChildComponentA //note that 'b' is the name of child router view
}
},
{
// B will be rendered in the second <router-view>
// when /your-sidebar-url/b is matched
path: '/child-path/b',
components: {
b: ChildComponentB //note that 'b' is the name of child router view
}
}
]
}
]
})