【问题标题】:get all routes in a vue router获取vue路由器中的所有路由
【发布时间】:2016-07-07 08:51:27
【问题描述】:

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

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.js vue-router


    【解决方案1】:

    从 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() }
    }
    

    【讨论】:

      【解决方案2】:

      您可以在模板中简单地迭代 $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

      【讨论】:

      • 不错!但是为什么使用 router.addRoutes() 添加的路由没有出现在该列表中?
      • @stallingOne 选项对象永远不会改变,相应的 github 问题说:github.com/vuejs/vue-router/issues/2280。奇怪的行为,我同意
      • 这正是我想要的,但是因为我使用的是 NUXT,它会根据文件夹呈现路线,我如何在返回的链接中包含该层次结构?
      【解决方案3】:

      由于 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 获取路由

      【讨论】:

        【解决方案4】:

        另一种解决方案是使用 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
          }))
        }
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 感谢您的回答,实际上 vue-1 路由器中有一个错误让我发布了这个...查看日期,无论如何感谢解决方案逻辑,荣誉。
          • $router.options.routes的官方文档在哪里?
          • $router.options.routes 将只有初始路由集。用addRoutes 添加的任何内容都不会出现在那里。
          • $router.options 是私有 API(TypeScript 中也没有):github.com/vuejs/vue-router/issues/2051#issuecomment-363686410
          • 有些路线不适合我。
          【解决方案6】:

          不要在 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/

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-08
          • 1970-01-01
          • 2021-10-14
          • 1970-01-01
          • 2021-09-30
          • 2020-06-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多