# 路由

# 说明

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
}
上次更新: 6/24/2022, 12:10:54 AM