关于vue.js:一劳永逸解决基于-keepalive-的后台多级路由缓存问题

44次阅读

共计 2271 个字符,预计需要花费 6 分钟才能阅读完成。

用过 vue-element-admin 的同学肯定很分明,路由的配置间接关系侧边栏导航菜单的展现,也得益于这种设计思路,简直大部分后盾框架都采纳这个计划,当然也包含了我写的 Fantastic-admin 这个中后盾框架。

但这个计划有个显著的问题,就是为了实现多级侧边栏导航菜单,则须要将路由配置成多级嵌套的模式,一旦超过两级,达到三级甚至更多级,就须要减少一个空布局页面(Empty.vue)用来给 component 应用,仅仅是为了生成层级菜单。此时就呈现了一个问题,因为 keep-alive 是在 Layout 上解决的,所以超过两级以上的路由都会变得难以解决,也没有一个绝对完满的解决方案。

在思考并解决这个问题之前,咱们先来看下页面大抵构造:

+------------------------------+
| Layout                       |
|  +------------------------+  |
|  | Empty                  |  |
|  |  +------------------+  |  |
|  |  | Page             |  |  |
|  |  +------------------+  |  |
|  +------------------------+  |
+------------------------------+

首先 keep-alive 是在 Layout 上进行解决,如果不缓存 Empty,则 Empty 上面的页面将无奈被缓存,如果缓存 Empty,又会导致 Empty 外面的所有页面都被缓存,无奈按需革除,置信接触过的同学必定感同身受其中的大坑。

解决思路

其实有一个绝对清晰简略的解决思路,既然缓存二级路由是没问题,而超过二级的两头层级页面也是没太大意义的,那为什么不将路由间接解决成二级,这样页面显示也就是二级的构造。

+------------------------------+                +------------------------------+
| Layout                       |                | Layout.vue                   |
|  +------------------------+  |                |  +------------------------+  |
|  | Empty                  |  |  +---------->  |  | Page                   |  |
|  |  +------------------+  |  |                |  |                        |  |
|  |  | Page             |  |  |                |  |                        |  |
|  |  +------------------+  |  |                |  |                        |  |
|  +------------------------+  |                |  +------------------------+  |
+------------------------------+                +------------------------------+

这里须要留神,路由配置还是放弃多级嵌套的模式,而这个配置并非最终注册应用的路由,仅仅是提供侧边栏导航菜单应用,同时再生成一份用于动静注册路由的数据,图例如果没看明确的话,能够看上面两组数据。

// 原始数据(用于侧边栏导航菜单){
    path: '/users',
    meta: {title: '用户治理'},
    children: [
        {
            path: 'clients',
            meta: {title: '客户治理'},
            children: [
                {
                    path: 'list',
                    meta: {title: '客户列表'}
                },
                {
                    path: 'detail',
                    meta: {title: '客户详情'}
                }
            ]
        }
    ]
}

// 解决后数据(用于动静注册路由){
    path: '/users',
    meta: {title: '用户治理'},
    children: [
        {
            path: 'clients/list',
            meta: {title: '客户列表'}
        },
        {
            path: 'clients/detail',
            meta: {title: '客户详情'}
        }
    ]
}

通过一个递归函数就能够解决好路由的数据,但这还不够,因为还须要解决面包屑导航。

原有的面包屑导航是通过 $route.matched 能够获取到嵌套路由每一层级的信息,而当路由被解决成两级后,也就无奈通过 $route.matched 进行显示了,所以在解决路由数据的同时,也须要解决面包屑导航的信息。大抵最终会解决成这样:

{
    path: '/users',
    meta: {title: '用户治理'},
    children: [
        {
            path: 'clients/list',
            meta: {
                title: '客户列表',
                breadCrumb: [{ path: '/users', title: '用户治理'},
                    {path: 'clients', title: '客户治理'},
                    {path: 'list', title: '客户列表'}
                ]
            }
        },
        {
            path: 'clients/detail',
            meta: {
                title: '客户详情',
                breadCrumb: [{ path: '/users', title: '用户治理'},
                    {path: 'clients', title: '客户治理'},
                    {path: 'detail', title: '客户详情'}
                ]
            }
        }
    ]
}

这样一来,通过 $route.meta.breadcrumb 就能够获取任意某个路由的残缺面包屑导航信息了。最终成果如下:

通过图片能够看到,这种计划也还是有肯定的限度,就是路由被解决成二级后,多级嵌套关系不存在了,也就是不能在 Empty 里写任何代码,因为都会被疏忽掉,只保留顶级和最深层的底级两个路由。

当然通过理论状况思考,这种限度并没有大问题,因为在后盾零碎里,自身模块绝对独立,即使侧边栏导航菜单是嵌套层级关系的,在右侧内容展现区域,简直都是独立模块展现,无需嵌套。

实例代码

本文次要是探讨实现思路,相干代码可在 Fantastic-admin 里查看,外围代码在这,点击查看。

正文完
 0