Я пытаюсь использовать навигацию в моем приложении Vue, чтобы в главном меню располагались все маршруты корневого уровня и боковое меню, если у маршрута есть дочерние элементы. Вот так:
![Goal](https://i.stack.imgur.com/C0VFJ.png)
Текущий дизайн, который у меня есть, имеет основную навигацию со ссылками на маршрутизацию вверху с видом на маршрутизатор ниже. Мне удалось настроить боковое меню, чтобы оно отображалось только тогда, когда я выбираю Travelers и правильно обновляю компоненты / контент. Однако у меня возникают проблемы с правильной маршрутизацией, когда я нажимаю на одну из ссылок в подменю, она не добавляется к текущему пути. Поэтому, когда я нажимаю на View, когда я нахожусь в localhost / Traveler и нажимаю View , URL меняется на localhost / View / вместо localhost / Путешественник / View . Также выбор в верхнем меню становится невыбранным, когда я выбираю что-то в дочернем меню.
![Unselecting](https://i.stack.imgur.com/zb0bx.png)
И я не могу попасть на страницы через что-то вроде localhost / Traveler / View * только 1024 * localhost / View
Я начал перечитывать документацию по вложенным маршрутам , когда начал писать этот пост, и я понял, что должен создавать новый маршрутизатор на каждом уровне, что я не делал в своем коде ниже .
Я также не уверен, как получить доступ к детям текущего маршрута. Я пытался отобразить их так:
<h2>Route: {{ $route.name }}</h2>
<ul id="example-1">
<li v-for="child in $route.children">
{{ child.name }}
</li>
</ul>
Но я ничего не получаю. Должны ли они быть переданы как Params или что-то? Или не так легко доступны?
Любой совет или помощь будут с благодарностью.
Root
Содержит главное меню Nav с ссылками на маршрутизатор и представлением маршрутизатора ниже.
<template>
<div id="app" class="container-fluid">
<div class="row">
<div style="width:100%">
<nav-menu params="route: route"></nav-menu>
</div>
</div>
<div class="row">
<div>
<router-view></router-view>
</div>
</div>
</div>
</template>
<script>
import NavMenu from './nav-menu'
export default {
components: {
'nav-menu': NavMenu
},
data() {
return {}
}
}
</script>
Навигационное меню
Заполняется маршрутами
<template>
<nav class="site-header sticky-top py-1">
<div class="container d-flex flex-column flex-md-row justify-content-between">
<a class="nav-item" v-for="(route, index) in routes" :key="index">
<router-link :to="{path: route.path, params: { idk: 1 }}" exact-active-class="active">
<icon :icon="route.icon" class="mr-2" /><span>{{ route.display }}</span>
</router-link>
</a>
</div>
</nav>
</template>
<script>
import { routes } from '../router/routes'
export default {
data() {
return {
routes,
collapsed: true
}
},
methods: {
toggleCollapsed: function (event) {
this.collapsed = !this.collapsed
}
}
}
</script>
Страница путешественника / просмотр
В настоящее время страница путешественника с боковым меню и другим представлением маршрутизатора для содержимого:
<template>
<div id="app" class="container-fluid">
<div class="wrapper">
<traveler-menu params="route: route"></traveler-menu>
<div id="content">
<router-view name="travlerview"></router-view>
</div>
</div>
</div>
</template>
<script>
import TravelerMenu from './traveler-menu'
export default {
components: {
'traveler-menu': TravelerMenu
},
data() {
return {}
}
}
</script>
Боковая панель / Меню путешественника
<template>
<nav id="sidebar">
<div class="sidebar-header">
<h3>Route's Children:</h3>
</div>
<ul class="list-unstyled components">
<li>
<a class="nav-item" v-for="(route, index) in travelerroutes" :key="index">
<router-link :to="{path: route.path, params: { idk: 1 }}" exact-active-class="active">
<icon :icon="route.icon" class="mr-2" /><span>{{ route.display }}</span>
</router-link>
</a>
</li>
</ul>
</nav>
</template>
<script>
import { travelerroutes } from '../../router/travelerroutes'
export default {
data() {
console.log(travelerroutes);
return {
travelerroutes,
collapsed: true
}
},
methods: {
toggleCollapsed: function (event) {
this.collapsed = !this.collapsed
}
}
}
</script>
Маршруты
import CounterExample from 'components/counter-example'
import FetchData from 'components/fetch-data'
import HomePage from 'components/home-page'
import TestPage from 'components/test-page'
import Travelers from 'components/Traveler/traveler-root'
import { travelerroutes } from './travelerroutes'
export const routes = [
{ name: 'home', path: '/', component: HomePage, display: 'Home', icon: 'home' },
{ name: 'counter', path: '/counter', component: CounterExample, display: 'Counter', icon: 'graduation-cap' },
{ name: 'fetch-data', path: '/fetch-data', component: FetchData, display: 'Fetch data', icon: 'list' },
{ name: 'test-page', path: '/test-page', component: TestPage, display: 'Test Page', icon: 'list' },
{
name: 'traveler-root', path: '/traveler', component: Travelers, display: 'Travelers', icon: 'list', children: travelerroutes
}
]
Маршруты путешественников (travelerroutes.js)
import TestPage from 'components/test-page'
import ViewTravelers from 'components/Traveler/TravelerPages/view-travelers'
export const travelerroutes = [{
name: 'View',
path: '/View',
display: 'View', icon: 'list',
components: {
travlerview: TestPage
}
},
{
name: 'Create',
path: '/Create',
display: 'Create', icon: 'list',
components: {
travlerview: ViewTravelers
}
},
{
name: 'Edit',
path: '/Edit',
display: 'Edit', icon: 'list',
components: {
travlerview: ViewTravelers
}
}];
маршрутизатор / index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import { routes } from './routes'
Vue.use(VueRouter)
let router = new VueRouter({
mode: 'history',
routes
})
export default router
app.js
import Vue from 'vue'
import axios from 'axios'
import router from './router/index'
import store from './store'
import { sync } from 'vuex-router-sync'
import App from 'components/app-root'
import { FontAwesomeIcon } from './icons'
// Registration of global components
Vue.component('icon', FontAwesomeIcon)
Vue.prototype.$http = axios
sync(store, router)
const app = new Vue({
store,
router,
...App
})
export {
app,
router,
store
}
Дайте мне знать, если вам нужно больше деталей, контекста или кода.