用过 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 里查看,外围代码在这,点击查看。