Как обновить vue-router

Я новичок в 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: [ ]
    }
  ]

Спасибо.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
4 279
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам необходимо импортировать vue router. Вы можете выбрать импорт vue router при создании нового проекта или позже, добавив vue router в проект.

Как только вы это сделаете, вам нужно определить свои маршруты. Пожалуйста, перейдите по этой ссылке - https://scotch.io/tutorials/getting-started-with-vue-router.

Обычно, если вы включаете параметр маршрутизатора при создании нового проекта, большая часть работы выполняется за вас с помощью cli.

Спасибо, но это не то, что мне нужно. Мой код в точности совпадает с тем, что предлагает эта статья. Моя проблема в том, что я не могу автоматически заполнить массив route []. В моем коде я использую жестко запрограммированные значения, такие как "страница, продукт, новости ..."

Mana 24.10.2018 15:36

Чтобы динамически добавить маршрут к существующему маршрутизатору, вы можете использовать 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

Thel-Rico 02.07.2019 15:16

Можете ли вы добавить пример, который работает? Потому что я пытался работать с addRoutes, но ничего не вышло. мой вопрос заключался в том, что я хотел добавить маршруты, которые я получаю в качестве ответа от API (поэтому я не знаю, сколько у меня маршрутов, и маршруты меняются каждый раз, когда я вызываю API. В моем вопросе я просто привел пример ответа и как должен выглядеть массив маршрутов)

Mana 02.07.2019 15:27

мое первое обновление было рабочим примером, я просто подделал данные, вернув обещание через 5 секунд для имитации сети, но способ продолжения такой же. Все, что вам нужно сделать, это проанализировать ваш JSON: см. Мое второе обновление

Thel-Rico 02.07.2019 16:19
Ответ принят как подходящий

Я просто использовал этот маршрут

var route = [
  {
    path: '/*',
    name: 'all',
    component: () => import('./component/All.vue')
  }
];

Другие вопросы по теме