vue三级及三级以上路由 keep-alive 开启缓存失效问题处理

一、失效原因:

如果多级路由的话,一般会有一个空白的router-view页面做为公共的模板充当中间的嵌套路由/页面;当你切换不同的页面,中间公共部分的组件,一会儿缓存,一会儿不缓存,因为是公共组件,导致了

最终的页面缓存失效。

 

二、解决办法:

目前我认为只有将三级路由转为二级路由来解决比较靠谱;

以我自己的项目为例,最终将接口返回的动态路由利用  this.safe.$router.addRoutes(aRouter), 来进行路由的注册,那么我们就需要在注册之前,将树形结构的三级或更多级转换位二级路由

具体的转换参考如下代码, 利用两个递归将中间的路由来过滤掉;

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: item.path,
                    redirect: item.redirect,
                    meta: item.meta
                  });
                }
                castToFlatRoute(item.children, parentPath + "/" + item.path, flatRoutes);
              } else {
                flatRoutes.push({
                  name: item.name,
                  path: item.path,
                  component: item.component,
                  meta: item.meta
                });
              }
            }
  return flatRoutes;
}
let lastAroutes = generateFlatRoutes(aRouter);

 

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;
}

 

以上通过两个递归的函数,将aRouter 这个多层级的树形结构转换为最多两级的树形结构,进而实现了将多级路由转为为二级路由;

具体递归使用还需要根据自己的返回数据进行微调!!!


 

posted @ 2021-03-11 15:39  茶记忆  阅读(6465)  评论(0编辑  收藏  举报