51

我正在尝试使用 vue 路由器创建一个简单的菜单,id 喜欢迭代所有路由并显示在我的菜单中,目前我在我的组件中使用下面的实例方法,但我只是得到一个函数,我将如何迭代以获得单个路由?

methods : {
 getMenuLinks: function() {

        var t = this.$router.map() ;
        //t returns a vue object instance
        return t._children ;
        // did not know how to iterate this 
   }

 }

我想迭代所有映射的路线以获得每个映射路线的如下内容:

<a v-link="{ path: 'home' }">Home</a>
4

6 回答 6

62

在 Nuxt 中,路由是自动生成的,所以我不能按照 @zxzak 的建议去做。

在这种情况下,您可以执行以下操作。

<template v-for="item in items">
    <b-nav-item :to="item.path">
        {{item.name}}
    </b-nav-item>
</template>
export default {
    created() {
        this.$router.options.routes.forEach(route => {
            this.items.push({
                name: route.name
                , path: route.path
            })
        })
    }
    , data() {
        return {
            items: []
        }
    }
}
于 2017-06-10T20:16:05.070 回答
22

$router.options.routes您可以简单地在模板中迭代:

<nav>
  <router-link v-for="route in $router.options.routes" :key="route.path" :to="route.path">{{ route.name }}</router-link>
</nav>

也许为所选路线添加样式:

:class="{ active: route.path === $router.currentRoute.path }"

编辑:对于活动类,请改用https://router.vuejs.org/api/#active-class

于 2018-10-06T15:48:51.110 回答
5

不要在 Vue 的内部进行中继,而是将路由放在起始组件的数据中。

var map = {
  '/foo': {
    component: Foo
  },
  '/bar': {
    component: Bar
  }
}

var routes = Object.keys(map)

var App = Vue.extend({
  data: function() {
    return {
      routes: routes
    }
  }
})

router.map(map)
router.start(App, '#app')

http://jsfiddle.net/xyu276sa/380/

于 2016-03-21T10:21:06.007 回答
3

从 vue-router 3.5 开始,Router 实例现在有一个 getRoutes() 方法。
所以一个最新的答案可能是

<router-link 
    for="r in routes" 
    :key="r.path" 
    :to="r.path"
>
    {{ r.name }}
</router-link>
computed: {
    routes() { return this.$router.getRoutes() }
}
于 2021-04-16T07:13:25.137 回答
1

另一种解决方案是使用 Webpack 的require.context

// search for src/pages/**/index.vue
function routesGen () {
  const pages = require.context('./pages/', true, /index\.vue$/)
  const filePaths = pages.keys()
  const getRoutePath = filePath => filePath.match(/\.(\/\S+)\/index\.vue/)[1]
  return filePaths.map(filePath => ({
    path: getRoutePath(filePath),
    component: pages(filePath).default
  }))
}
于 2019-10-11T02:05:07.300 回答
0

VueRouter其他类一样,它只是一个 JavaScript 类,您可以扩展它并添加任何自定义功能,包括有问题的功能:

// TypeScript

import Vue from 'vue';
import VueRouter, { RouteConfig } from 'vue-router';

class VueRouterEx extends VueRouter {
  matcher: any;

  public routes: RouteConfig[] = [];

  constructor(options) {
    super(options);
    const { addRoutes } = this.matcher;
    const { routes } = options;

    this.routes = routes;

    this.matcher.addRoutes = (newRoutes) => {
      this.routes.push(...newRoutes);
      addRoutes(newRoutes);
    };
  }
}

Vue.use(VueRouterEx);

const router = new VueRouterEx({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [],
});

export default router;

因此,从任何组件,您都可以使用this.$router.routes

于 2020-01-14T16:38:07.820 回答