动态路由

![image.png](https://cos.easydoc.net/78832103/files/kydcdt1d.png) 后端返回的路由信息 ```json { "code": 0, "data": [ { "component": "User", "icon": "user", "name": "User", "path": "/user" }, { "component": "Order", "icon": "ordered-list", "name": "Order", "path": "/order" } ], "msg": "ok" } ``` `Home.vue` ```html <template> <a-layout id="components-layout-demo-fixed-sider"> <a-layout-sider :style="{ overflow: 'auto', height: '100vh', position: 'fixed', left: 0 }"> <div class="logo" /> <a-menu theme="dark" mode="inline" :default-selected-keys="['4']"> <a-menu-item v-for="(item, index) in menus" :key="index" @click="$router.push({name: item.name})"> <a-icon :type="item.icon" /> <span class="nav-text">{{item.name}}</span> </a-menu-item> </a-menu> </a-layout-sider> <a-layout :style="{ marginLeft: '200px' }"> <a-layout-header :style="{ background: '#fff', padding: 0 }" /> <a-layout-content :style="{ margin: '24px 16px 0', overflow: 'initial' }"> <div :style="{ padding: '24px', background: '#fff', textAlign: 'center' }"> <router-view name="content"></router-view> </div> </a-layout-content> <a-layout-footer :style="{ textAlign: 'center' }"> Ant Design ©2018 Created by Ant UED </a-layout-footer> </a-layout> </a-layout> </template> <style> #components-layout-demo-fixed-sider .logo { height: 32px; background: rgba(255, 255, 255, 0.2); margin: 16px; } </style> <script> import getMenus from "../utils/index"; export default { data(){ return { menus: [] } }, mounted() { getMenus.then(ret=>{ this.menus = ret.data.data; }) } } </script> ``` `router/index.js` ```javascript import Vue from 'vue' import VueRouter from 'vue-router' import Home from '../views/Home.vue' import getMenus from "../utils/index"; Vue.use(VueRouter) const routes = [ { path: '/', name: 'Home', component: Home, }, { path: '/about', name: 'About', component: () => import('../views/About.vue') } ] const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes }) // 从后端获取路由, 通过router.addRoute动态添加路由 getMenus.then(ret=>{ ret.data.data.forEach(item=>{ console.log('item:', item); router.addRoute('Home', { path: item.path, name: item.name, components: { content: () => import('../views/'+item.component) } }) }) }) // 去除跳转当前路由出错消息 const originalPush = VueRouter.prototype.push VueRouter.prototype.push = function push(location) { return originalPush.call(this, location).catch(err => err) } export default router; ```