# 路由
# 说明
vue
路由 官方文档 (opens new window),在阅读本文档前,请对 vue-router
的使用有了解。
本项目的路由以 router.addRoute() (opens new window) 形式通过接口动态加载。
# 目录结构
└─ src # 项目主文件
└─ router # 路由文件夹
├─ index.js # 路由主文件
├─ promission.js # 路由动态加载
├─ _import_development.js # 开发环境引入组件方式
└─ _import_production.js # 生产环境引入组件方式
# index.js
文件
路由入口文件,只有登录和404两个固定路由,其它路由由 addRoute
方法添加。
import Vue from "vue";
import Router from "vue-router";
import Login from "@/pages/login"; // 登录页
import NotFound from "@/pages/404"; // 404页
Vue.use(Router);
const constantRoutes = [
{
path: "/",
redirect: "/login", // 重定向到登录页
},
{
path: "/login",
component: Login,
},
{
path: "*",
component: NotFound, // 无匹配路由则进入 404 页面
},
];
export default new Router({
mode: "history",
linkActiveClass: "is-active",
linkExactActiveClass: "is-active",
base: __dirname,
routes: constantRoutes,
});
# promission.js
文件
动态加载路由方法,该文件在 main.js
中引入,以使每次刷新页面时都会执行。
该路由添加方法在 login.vue
中也执行了一次,待后期优化合并。
const _import = require('./_import_' + process.env.NODE_ENV)//引入组件方式
import router from "@/router/index"
import Layout from '@/pages/Layout'
import store from '@/store/index'
// 无菜单时则不执行,通常为未登录状态。
if (store.state.user.menus && Array.isArray(store.state.user.menus)) {
const routes = store.state.user.menus
let asyncRoutes = filterAsyncRouter(routes) //过滤路由
let isAdd = false;
if (!isAdd) {
router.addRoutes(asyncRoutes) //动态添加路由
};
isAdd = true
}
// 处理接口获取的路由文件
function filterAsyncRouter(asyncRoutes) {
//遍历后台传来的路由字符串,转换为组件对象
const accessedRouters = asyncRoutes.filter(route => {
if (route.component) {
if (route.component === 'Layout') { //Layout组件特殊处理
route.component = Layout
} else {
route.component = _import(route.component)
}
}
if (route.children && route.children.length) {
route.children = filterAsyncRouter(route.children)
}
return true
})
return accessedRouters
}