vue3构建后台管理系统(4)——基于Vue Router实现首页快捷导航

系列文章目录

系列文章第一章:
vue3+electron开发桌面软件入门与实战(0)——创建electron应用



前言

上篇文章介绍了基于router插件,view ui的路由实现。

本篇文章在上文的基础上,借助router.js中配置的参数,实现首页快捷导航。通过对router的改造,进一步理解路由的用法。


一、场景

系统中,除了左侧的路由列表,我们可能还需要在首页实现快捷导航,能够将我们常用的页面路由渲染在首页,方便用户快捷地打开需要的页面。

基于前端快捷导航的实现,再配合缓存或者数据库,就可以实现用户的行为检测,为不同的用户提供不同的快捷导航,从而提升用户体验。

二、设计思路

1.快捷导航从何而来

快捷导航不论做成什么样式,从本质上来讲,也不过是和侧边栏一样的一个路由链接,它就相当于是全路由的一个子集。所以快捷导航的数据,应由路由文件而来。

2.路由文件的优化

既然快捷导航由路由文件而来,那么我们首先要做的就是,在路由文件的各个路由节点上,区分出哪个可以作为快捷导航,哪个不做处理。
所以我们增加属性参数:isHomeList。以路由文件中的某个对象为例:

   {
    
    
        path: '/gitTool',
        name: 'gitTool',
        component: Layout,
        meta: {
    
    
            // hideInMenu: true
        },
        children: [
            {
    
    
                path: '/gitTool_page',
                name: 'gitTool_page',
                meta: {
    
    
                    title: "git工具",
                    icon:'md-hammer',
                    // iconFont:'#icon-weixin', //如果是阿里图标,使用这个参数
                    isHomeList:true  //不要用is开头命名
                },
                component: () => import('@/views/GitTool/GitTool.vue')
            }
        ]
    },

按照规范,布尔类型参数是不能以is开头,这主要是为了照顾后端某些自动序列化,有些规范可以任性,但是这个规范如果不注意,在和后端合作写路由管理的时候,会出现bug或者增加工作量。我这里写个反例,以作提醒。

同时我也建议,想把前端做好,对后端的技术要求是,起码能用后端框架写业务代码,达到后端码农的水平。专精前端,熟悉后端,才能做一个能无碍沟通,解决问题的T型人才。

3.首页快捷导航渲染

首页拿到路由数据,然后根据isHomeList属性筛选。

const homeList=ref([])
function getHomeList(list){
    
    
  return list.filter((v,i)=>{
    
    
    if(v.meta.isHomeList){
    
    
      return v
    }
  })
}
onMounted(()=>{
    
    
  homeList.value=getHomeList(router.getRoutes())
})
  1. router.getRoutes():获取路由数据
  2. getHomeList:从路由数据里筛选出isHomeList为true的数据

4.配合后端实现路由管理

一般的管理系统都会包含路由管理模块,所以路由数据并不会直接定义在前端。而是通过:管理模块维护数据——>后端保存数据——>首页获取路由数据。

5.渲染快捷导航

前端渲染逻辑:

  <Row>
    <Col v-for="item in homeList">
      <Card style="width:120px;margin: 8px" @click="turntoPage(item.name)">
        <div style="text-align:center">
          <svg v-if="item.meta.iconFont" class="icon" aria-hidden="true">
            <use v-bind:xlink:href="item.meta.iconFont"></use>
          </svg>
          <Icon v-else :type="item.meta.icon" />

          <h3>{
    
    {
    
     item.meta.title }}</h3>
        </div>
      </Card>
    </Col>
  </Row>

拿到上面的homeList数据后,把需要的属性渲染到页面上即可。

最终效果如图:
在这里插入图片描述

这就简单地实现了由路由属性控制快捷导航。以后不论是想要根据用户操作习惯来优化首页导航,还是配合后端利用路由管理设置首页导航,都可以通过操作isHomeList属性来实现。


总结

如果理解了上篇文章中基于router实现导航栏,那么本文只能算是个小demo,旨在打开思路——只要设计合理,router.js中的对象属性是可以随心所欲操作的。

其实不论是导航栏的渲染,还是首页快捷导航的渲染,都蕴藏了一个前端很重要的思路——渲染逻辑和业务逻辑解耦。

渲染逻辑,就是我拿到数据后,如何把数据渲染成页面。业务逻辑,则是在产生数据。为什么siHomeList一个小小属性,能够支撑后面各种拓展?

就是因为我整个页面的渲染,都是基于isHomeList来实现的,这就保证了我页面输入是唯一的、固定的。以后不论你想做任何业务,只要你通过自己的业务逻辑,合理去维护isHomeList,那么就可以支撑自己的业务。

以小见大,整个router.js都是这种思想的体现。我和路由相关的所有操作,不管你是做导航栏、首页快捷导航、历史导航记录、页面打开次数统计等等操作,都是通过router.js中暴露的对象实现的。最终就会形成一个大致分层结构:业务层(controller)——router对象层——页面层(view)。

业务层专注于如何形成科学的router对象,页面层专注于如何把router对象更健壮地渲染。

正是基于这种分层思想,我们才可以很容易地拓展一个快捷导航功能。不过总结里介绍的这种思维,是给只差临门一脚的同学准备的,如果你想更优雅地写好前端代码,又总是迫切地站在一个大门前,不得而入。那么我希望上面这几句话能对你有一些启发。

但是总会有人会不认同这种思维,觉得分层影响了自己关注点,造成关注点分离,从而影响代码可读性,那也无伤大雅。上面只是一家之言,一定不能适用于所有场景,甚至也有可能毫无合理性可言。

一年后的我重新审视现在的自己,大概率是觉得幼稚的。

惟愿诸君,求同存异,共同进步。

猜你喜欢

转载自blog.csdn.net/zjsj_lize/article/details/130259453