How to make dynamic routes on the vue router?

大城市里の小女人 提交于 2019-11-26 11:41:45

问题


My MainNavBar component like this :

<template>
  ...
  <v-list-item
    v-for=\"(item, index) in listMenu\"
    :key=\"index\"
    @click=\"goTo(item)\"
  >
    <v-list-item-content>
      <v-list-item-title>{{ item }}</v-list-item-title>
    </v-list-item-content>
  </v-list-item>
  ...
</template>
<script>
  export default {
      ...
      methods: {
        goTo(key) {
          this.$router.push({ name: key });
        },
        ...mapActions(\"dataStore\", [\"getMenu\"])
      },
      computed: {
        ...mapGetters(\"dataStore\", [\"listMenu\"])
      }
    };
</script>

listMenu taken from API. It is a menu list

My router configuration like this :

import Vue from \"vue\";
import Router from \"vue-router\";
import Application from \"@/pages/Application\"
import MainNavbar from \"@/layout/MainNavbar\";
...
import { APPLICATION_ROUTE as RouteConfig } from \"./route-config\";

Vue.use(Router);
export default new Router({
  mode: \'history\',
  routes: [
    {
      path: \"/menu-first\",
      name: RouteConfig.APPLICATION_NAME_1.NAME,
      components: { default: Application, header: MainNavbar }
    },
    {
      path: \"/menu-two\",
      name: RouteConfig.APPLICATION_NAME_2.NAME,
      components: { default: Application, header: MainNavbar }
    },
    ...
  ]
});

My RouterConfig like this :

export const APPLICATION_ROUTE = {
    APPLICATION_NAME_1: {
        NAME: \"menu-first\"
    },
    APPLICATION_NAME_2: {
        NAME: \"menu-two\"
    },
    ...
};

And my application component like this :

<template>
  <v-flex xs12>
    <v-card dark color=\"light-blue darken-4\">
      <v-card-title>
        <v-flex xs4>
          <p class=\"title\">Name</p>
          <p class=\"body-2 margin-sub-text\">{{detailMenu.name}}</p>
        </v-flex>
        <v-flex xs4>
          <p class=\"title\">URL</p>
          <p class=\"body-2 margin-sub-text\">{{detailMenu.url}}</p>
        </v-flex>
        <v-flex xs4>
          ...
        </v-flex>
      </v-card-title>
    </v-card>
  </v-flex>
</template>

<script>
import { mapActions, mapState, mapGetters } from \"vuex\";
export default {
  ..
  created() {
    this.getDetailMenu(this.$route.path);
  },
  computed: mapState({
    data: state => state.dataStore.data,
    ...mapGetters(\"dataStore\", [\"detailMenu\"])
  }),
  methods: {
    ...mapActions(\"dataStore\", [\"getDetailMenu\"]),
  },
  watch: {
    $route() {
      this.getDetailMenu(this.$route.path);
    }
  }
};
</script>

From the configuration router, my router is not dynamic. I want to make my router dynamic. So the path in the router configuration is taken from listMenu (API)

How do I do that?


回答1:


This link should help : https://router.vuejs.org/guide/essentials/navigation.html

goTo(key) {
  this.$router.push({ path: key });
}



回答2:


I suppose getDetailMenu is calling API method to get listMenu. You can create route dynamically using addRoutes method

Pseudo code

created() {
  this.getDetailMenu(this.$route.path)
    .then((listMenu) => {
      // you need to return listMenu from getDetailMenu
      listMenu.forEach((item, index) => createAndAppendRoute(item, index))
    })
},
methods: {
  createAndAppendRoute: (item, index) => {
    console.log(item, index)
    // Base on your data, you should be able to create router name and path from item and index
    // here is just an example
    let newRoute = {
      path: `/${item}`,
      name: `${item}_${index}`,
      components: { default: Application, header: MainNavbar },
    }

    this.$router.addRoutes([newRoute])
  }
}


来源:https://stackoverflow.com/questions/57836601/how-to-make-dynamic-routes-on-the-vue-router

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!