基础路由
const routes = [{
path: '/login',
hidden: true,
meta: {
layout: 'blank'
},
component: () => import( '../views/user/login.vue')
},
{
path: '/home',
name: '首页',
component: Home,
meta: {
fixed: true
},
icon: 'home'
},
{
path: '/404',
hidden: true,
component: () => import('../views/404.vue'),
meta: {
layout: 'blank'
}
}
]
路由初始化
let _routes = !!sessionStorage.getItem("routes") ? getRenderRoutes(JSON.parse(sessionStorage.getItem("routes"))) : routes;
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes: _routes
})
动态获取路由并更新
router.beforeEach((to, from, next) => {
if (to.path === "/login") {
clearAllData(store);
}else {
if(!store.state.user.userInfo.userRole) {
next('/login');
return;
}
}
if (!sessionStorage.getItem("routes") && !!store.state.user.userInfo.userRole) {
let role = store.state.user.userInfo.userRole;
getMenu(role).then(res => {
if (res.data && res.data.length > 0) {
let par = res.data.filter(item => +item.menuType === 0);
let child = res.data.filter(item => +item.menuType === 1);
let menu = par.map(item => {
let tmp = child.filter(i => i.parentId === item.id)
item.childrens = tmp;
return item;
})
sessionStorage.setItem("routes", JSON.stringify(menu));
let renderRoutes = getRenderRoutes(menu);
router.matcher = new VueRouter({
routes: renderRoutes
}).matcher;
}
next()
return;
})
}
next()
})
function getRenderRoutes(data) {
let menus = formatRoutes(data);
let unfound = {
path: '*',
redirect: '/404',
hidden: true
};
menus.push(unfound);
let result = routes.concat(menus);
return result;
}
function formatRoutes(aMenu) {
const aRouter = []
aMenu.forEach(oMenu => {
const {
url,
component,
name,
icon,
childrens,
alwaysShow,
layout,
keepAlive
} = oMenu
const oRouter = {
path: url,
component(resolve) {
if (!!component) {
return require([`@/views${component}.vue`], resolve)
} else {
return require([`@/components/layout/ParentLayout.vue`], resolve)
}
},
name: name,
icon: icon,
hidden: +alwaysShow !== 1,
meta: {
layout: layout,
keepAlive: +keepAlive === 1
},
children: !!childrens && childrens.length > 0 ? formatRoutes(childrens) : []
}
aRouter.push(oRouter)
})
return aRouter
}
页面渲染
<div id="app">
<component :is="layout">
<router-view></router-view>
</component>
</div>
<div>
<keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>
</div>