动态添加路由
- 菜单权限控制(菜单中的页面是否能被访问)
- 静态配置的路由时直接在routes里面进行配置,但是动态路由是通过
router.addRoutes()
进行配置
router/index.js
import Vue from "vue";
import VueRouter from "vue-router";
import aaaRouter from "./modules/aaa";
import bbbRouter from "./modules/bbb";
import cccRouter from "./modules/ccc";
import Layout from "@/layout";
Vue.use(VueRouter);
export const asyncRoutes = [
aaaRouter,
bbbRouter,
cccRouter,
]
export const constantRoutes = [
{
path: '/',
component: Layout,
redirect: '/index',
children: [
{
path: '/index',
name: 'index',
meta: { title: "首页" },
component: () => import('@/views/index/index.vue'),
},
]
},
{
path: '/login',
component: () => import('@/views/login/login.vue'),
},
{
path: '/refresh',
component: resolve => require(['@/views/refresh.vue'], resolve),
meta: {
title: '路由刷新'
}
},
{
name: '404',
path: '/404',
component: () => import('@/views/notFound/index.vue')
},
];
const createRouter = () => new VueRouter({
scrollBehavior: () => ({ y: 0 }),
routes: constantRoutes
})
const router = createRouter();
export function resetRouter() {
const newRouter = createRouter();
router.matcher = newRouter.matcher;
}
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => err)
}
export default router;
store/modules/permission.js
import { constantRoutes } from "@/router";
import https from "@/https/index/index.js";
const state = {
menuList: [],
routes: [],
}
const mutations = {
setMenuList(state, payload) {
state.menuList = payload
},
setRoute(state, route){
state.routes = [...constantRoutes, ...route]
}
}
const actions = {
setMenuList({ commit }) {
return new Promise((resolve) => {
https.getMenuList().then((res) => {
if (res.data.code == 200) {
commit("setMenuList", res.data.data);
resolve(res.data.data);
}
})
});
},
}
const getters = {
};
export default {
namespaced: true,
state,
mutations,
actions,
getters
};
src/permission.js
- 动态添加路由-使用路由导航守卫
- 最后添加404页面
- 使用
router.addRoutes()
添加路由
- 注意:新版本
router.addRoutes
已废弃:使用 router.addRoute()
代替,只能router.addRoute()
遍历数组一条一条添加
import router, { asyncRoutes } from "@/router";
import store from "@/store";
import { Message } from "element-ui";
const whiteList = ["/login", "/404"];
let hasRoutes = true
router.beforeEach(async (to, from, next) => {
let token = sessionStorage.getItem("token");
if (token) {
if (to.path === "/login") {
console.log('to.path =login');
next({ path: "/" });
} else {
try {
if (hasRoutes) {
const menus = await store.dispatch('permission/setMenuList')
const menusUrlList = []
menus.forEach((item) => {
menusUrlList.push(item.url)
}
const filterRoute = asyncRoutes.filter(item => {
return menusUrlList.includes(item.path)
})
filterRoute.push({ path: '*', redirect: '/404', hidden: true })
router.addRoutes(filterRoute)
store.commit('permission/setRoute', filterRoute)
hasRoutes = false
next({ ...to, replace: true });
} else {
next()
}
} catch (error) {
Message.error(error || "请重新登录");
}
}
} else {
if (whiteList.indexOf(to.path) !== -1) {
next();
} else {
next(`/login`);
}
}
});
router.afterEach(() => {
});