vue-element-admin 超过两级嵌套路由无法缓存的解决办法

解决方法如下:

  1. 增加路由扁平化处理方法(src/store/modules/permission.js):

    /**
    * 生成扁平化机构路由(仅两级结构)
    * @param {允许访问的路由Tree} accessRoutes
    * 路由基本机构:
    * {
    * name: String,
    * path: String,
    * component: Component,
    * redirect: String,
    * children: [
    * ]
    * }
    */
    function generateFlatRoutes(accessRoutes) {
    let flatRoutes = [];

    for (let item of accessRoutes) {
    let childrenFflatRoutes = [];
    if (item.children && item.children.length > 0) {
    childrenFflatRoutes = castToFlatRoute(item.children, "");
    }

    // 一级路由是布局路由,需要处理的只是其子路由数据
    flatRoutes.push({
    name: item.name,
    path: item.path,
    component: item.component,
    redirect: item.redirect,
    children: childrenFflatRoutes
    });
    }

    return flatRoutes;
    }

    /**
    * 将子路由转换为扁平化路由数组(仅一级)
    * @param {待转换的子路由数组} routes
    * @param {父级路由路径} parentPath
    */
    function castToFlatRoute(routes, parentPath, flatRoutes = []) {
    for (let item of routes) {
    if (item.children && item.children.length > 0) {
    if (item.redirect && item.redirect !== 'noRedirect') {
    flatRoutes.push({
    name: item.name,
    path: (parentPath + "/" + item.path).substring(1),
    redirect: item.redirect,
    meta: item.meta
    });
    }
    castToFlatRoute(item.children, parentPath + "/" + item.path, flatRoutes);
    } else {
    flatRoutes.push({
    name: item.name,
    path: (parentPath + "/" + item.path).substring(1),
    component: item.component,
    meta: item.meta
    });
    }
    }

    return flatRoutes;
    }

    // 在原有的生成可访问路由方法中,增加路由扁平化处理,并返回扁平化处理后的结果,具体修改参看分割线部分:
    const actions = {
    generateRoutes({
    commit
    }, permissionKeys) {
    return new Promise(resolve => {
    let accessedRoutes = filterAsyncRoutes(asyncRoutes, permissionKeys, false)
    // -------------------------- 分隔线 ----------------------------
    let flatRoutes = generateFlatRoutes(accessedRoutes)

    commit('SET_ROUTES', accessedRoutes)
    resolve(flatRoutes)
    // -------------------------- /分隔线 ----------------------------
    })
    }
    }

    1. 为了方便后续维护,还是修改下vue-router钩子函数的变量名称吧(也可以不改):

      // 拉取用户权限数据
      const { permissions } = await store.dispatch('user/getInfo')

      // 这里把原来的 accessRoutes 修改成了 flatRoutes
      const flatRoutes = await store.dispatch('permission/generateRoutes', permissions)

      // dynamically add accessible routes
      router.addRoutes(flatRoutes)

posted @ 2022-06-24 11:33  谢其江  阅读(818)  评论(0编辑  收藏  举报