Я новичок в vuejs. Я работаю с vue cli 3. У меня есть проект с разными компонентами. У меня есть компонент меню, в котором я получаю все пункты меню из API (код ниже). Я установил vue-router для выполнения маршрутизации, но моя проблема в том, что я не знаю, как заполнить массив маршрутов внутри объекта маршрутизатора. Я много искал, но ничего не помогло.
По сути, вместо того, чтобы заполнять маршруты жестко закодированными путями и компонентами ... Я хочу автоматически заполнять его элементами, которые я получаю из api.
<template>
<div class = "Menu">
<nav class = "navbar navbar-default navbar-custom">
<div class = "container">
<div class = "navbar-header">
<button type = "button" class = "navbar-toggle" data-toggle = "collapse" data-target = "#navbar-collapse-1">
<span class = "sr-only">Toggle navigation</span>
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
</button>
</div>
<div class = "collapse navbar-collapse" id = "navbar-collapse-1">
<ul class = "nav navbar-nav navbar-right" v-for = "menu in main_menu" v-bind:key = "menu.menu_item">
<router-link class = "dropdown-toggle" data-toggle = "dropdown" :to = "menu.menu_url"></router-link>
<li><router-link :to = "menu.menu_url">{{ menu.menu_item }}</router-link>
<ul class = "dropdown-menu" v-for = "list in menu.list_item" v-bind:key = "list.url">
<li><router-link v-bind:to = "list.menu_url">{{ list.title }}</router-link></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<router-view></router-view>
</div>
</template>
<script>
import axios from 'axios';
export default {
name: 'Menu',
data () {
return {
main_menu: null,
error:""
}
},
mounted () {
//console.info(this.page);
axios({ method: "GET", "url": "http://apiurl" }).then(result => {
this.main_menu = result.data.main_menu;
},
error => {
this.error = error;
});
}
}
}
</script>router.js:
import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'
Vue.use(Router)
var route = [
{
path: '/home',
name: 'Home',
component: Home
},
{
path: '/awards',
name: 'Awards',
component: () => import('./views/Awards.vue')
},
{
path: '/news',
name: 'News',
component: () => import('./views/News.vue')
},
{
path: '/product',
name: 'Product',
component: () => import( './views/Product.vue')
},
{
path: '/page',
name: 'Page',
component: () => import('./views/Page.vue')
}
];
export default new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: route
})И json, который я получаю из api:
main_menu: [
{
menu_item: "Home",
menu_url: "/home",
list_item: [ ]
},
{
menu_item: "Awards",
menu_url: "/awards",
list_item: [ ]
},
{
menu_item: "Product",
menu_url: "product",
list_item: [
{
url: "/product/sticker",
title: "sticker"
},
{
url: "/product/cup",
title: "Promotion Cup"
}
]
},
{
menu_item: "News",
menu_url: "/news",
list_item: [ ]
},
{
menu_item: "Page",
menu_url: "/page",
list_item: [ ]
}
]
Спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам необходимо импортировать vue router. Вы можете выбрать импорт vue router при создании нового проекта или позже, добавив vue router в проект.
Как только вы это сделаете, вам нужно определить свои маршруты. Пожалуйста, перейдите по этой ссылке - https://scotch.io/tutorials/getting-started-with-vue-router.
Обычно, если вы включаете параметр маршрутизатора при создании нового проекта, большая часть работы выполняется за вас с помощью cli.
Чтобы динамически добавить маршрут к существующему маршрутизатору, вы можете использовать router.addRoutes([]) следующим образом:
router.js:
Vue.use(Router)
// define your static routes
var route = [
{
path: '/home',
name: 'Home',
component: Home
}
];
export default new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: route
})
где-нибудь еще
import router from '@/router'
router.addRoutes([{
path: '/awards',
name: 'Awards',
component: () => import('./views/Awards.vue')
},
{
path: '/news',
name: 'News',
component: () => import('./views/News.vue')
},
{
path: '/product',
name: 'Product',
component: () => import( './views/Product.vue')
},
{
path: '/page',
name: 'Page',
component: () => import('./views/Page.vue')
}
])
router.push('/page')
ОБНОВЛЕНИЕ: еще один пример с обещанием
import router from '@/router'
const getRoutesFromApi = () => {
return new Promise((resolve, reject) => {
const data = [
{
path: '/awards',
name: 'Awards',
component: () => import('./views/Awards.vue')
},
{
path: '/news',
name: 'News',
component: () => import('./views/News.vue')
},
{
path: '/product',
name: 'Product',
component: () => import( './views/Product.vue')
},
{
path: '/page',
name: 'Page',
component: () => import('./views/Page.vue')
}
]
setTimeout(resolve(data), 5000)
})
}
getRoutesFromApi().then(response => router.addRoutes(response))
ОБНОВЛЕНИЕ 2: более конкретный пример
import router from '@/router'
import axios from 'axios'
axios.get('http://your-api/whatever').then(response => {
// response contains your data as json, you have to fetch them to get vuejs route-like object
const routes = JSON.parse(response.data).map(o => {
// here you have to transform your data in vuejs route item for example
return {
path: o.menu_url
name: o.menu_item + 'View'
component: () => import('./views/' + o.menu_item + '.vue')
}
})
router.addRoutes(routes)
}
Прочитал ваш вопрос, вы можете добавить маршруты после создания роутера методом addRoutes. в моем примере я жестко запрограммировал дополнительные маршруты, но вы можете получить их из api
Можете ли вы добавить пример, который работает? Потому что я пытался работать с addRoutes, но ничего не вышло. мой вопрос заключался в том, что я хотел добавить маршруты, которые я получаю в качестве ответа от API (поэтому я не знаю, сколько у меня маршрутов, и маршруты меняются каждый раз, когда я вызываю API. В моем вопросе я просто привел пример ответа и как должен выглядеть массив маршрутов)
мое первое обновление было рабочим примером, я просто подделал данные, вернув обещание через 5 секунд для имитации сети, но способ продолжения такой же. Все, что вам нужно сделать, это проанализировать ваш JSON: см. Мое второе обновление
Я просто использовал этот маршрут
var route = [
{
path: '/*',
name: 'all',
component: () => import('./component/All.vue')
}
];
Спасибо, но это не то, что мне нужно. Мой код в точности совпадает с тем, что предлагает эта статья. Моя проблема в том, что я не могу автоматически заполнить массив route []. В моем коде я использую жестко запрограммированные значения, такие как "страница, продукт, новости ..."