获取vue路由器中的所有路由
get all routes in a vue router
我正在尝试使用 vue router 创建一个简单的菜单,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>
不要依赖 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')
在 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: []
}
}
}
您可以简单地在模板中迭代 $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 }"
编辑:对于活动 class,请改用 https://router.vuejs.org/api/#active-class
另一个解决方案是使用 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
}))
}
由于 VueRouter
与其他 class 一样只是 JavaScript class,您可以扩展它并添加任何自定义功能,包括有问题的功能:
// 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
获取路由
从 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() }
}
我正在尝试使用 vue router 创建一个简单的菜单,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>
不要依赖 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')
在 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: []
}
}
}
您可以简单地在模板中迭代 $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 }"
编辑:对于活动 class,请改用 https://router.vuejs.org/api/#active-class
另一个解决方案是使用 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
}))
}
由于 VueRouter
与其他 class 一样只是 JavaScript class,您可以扩展它并添加任何自定义功能,包括有问题的功能:
// 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
从 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() }
}