简体   繁体   English

如何更新vue-router

[英]How to update vue-router

I am new to vuejs I work with vue cli 3. and I have a project with different components. 我是vuejs的新手,我使用vue cli3。我有一个包含不同组件的项目。 I have a menu component, where I get all the menu items from an api(code bellow). 我有一个菜单组件,在这里我可以从一个api(代码波纹管)中获取所有菜单项。 I have installed vue-router, to do the routing, but my problem is that I dont know how to fill the routes array inside router object. 我已经安装了vue-router来进行路由,但是我的问题是我不知道如何在路由器对象内部填充路由数组。 I have searched a lot but nothing helped. 我进行了很多搜索,但没有任何帮助。

So basically instead of filling the routes with harcoded paths, and components.. I want to automatically fill it with the items I get from the api. 因此,基本上,而不是使用经过编码的路径和组件来填充路由。我想自动使用从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.log(this.page); axios({ method: "GET", "url": "http://apiurl" }).then(result => { this.main_menu = result.data.main_menu; }, error => { this.error = error; }); } } } </script> 

the router.js is: 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 }) 

And the json I get from the api : 我从api得到的json:

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: [ ]
    }
  ]

Thank you. 谢谢。

You need to import vue router. 您需要导入vue路由器。 You can choose to import vue router when creating a new project or later by adding vue router to the project. 您可以在创建新项目时选择导入vue路由器,也可以稍后通过将vue路由器添加到项目中来选择导入。

Once you do that you need to define your routes. 完成后,您需要定义路线。 Please follow this link - https://scotch.io/tutorials/getting-started-with-vue-router . 请点击此链接-https: //scotch.io/tutorials/getting-started-with-vue-router

Basically if you include router option while creating new project most of work is done for you by cli. 基本上,如果在创建新项目时包括路由器选项,那么cli会为您完成大部分工作。

To dynamically add route to existing router, you could use router.addRoutes([]) as follow : 要动态添加到现有路由器的路由,可以使用router.addRoutes([])如下:

router.js : 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
})

anywhere else 其他任何地方

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')

UPDATE: another example with promise 更新:另一个承诺的例子

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))

UPDATE 2 : more concrete example 更新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)
}

Well I just used this route 好吧,我只是用这条路线

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM