解决elementui中NavMenu导航菜单高亮问题(解决多种情况)

目录
  • 前言
  • 我在项目中遇到的情况有三种:(vue-cli+elementui)
    • 1、横向菜单
    • 2、纵向菜单
    • 3、嵌套式菜单
  • 代码实现
    • 1、横向菜单
    • 2、纵向菜单
    • 3、嵌套式菜单

前言

如果使用elementui这个框架来开发系统,那么我们几乎都会使用到NavMenu 组件。

我们可能需要菜单根据我们点击的那一项高亮显示,刷新页面了之后还是会相应的高亮显示。

elementUI组件官网:

https://element.eleme.io/#/zh-CN/component/menu

我在项目中遇到的情况有三种:(vue-cli+elementui)

1、横向菜单

如果仅有一个菜单,那么点击当前菜单高亮;如果菜单下有二级下拉,那么点击下拉二级菜单高亮,并且一级菜单也高亮,mode="horizontal"时一级菜单就会自动高亮了。(刷新页面后依旧保持高亮)

2、纵向菜单

如果仅有一个菜单,那么点击当前菜单高亮;如果菜单下有二级下拉,那么点击下拉二级菜单高亮(刷新页面后依旧保持高亮)

3、嵌套式菜单

横向主菜单高亮,代表这个页面是当前页面;在当前页面中还嵌入一个纵向菜单,这个纵向菜单高亮代表这个页面显示不同的tab(刷新页面后依旧保持高亮)

代码实现

NavMenu 导航菜单高亮如果需要刷新页面了之后也能高亮,那么就使用路由匹配式高亮。

我们的el-menu组件标签中配置最重要的两个(其他配置看官网):

:default-active="activeMenu"   // 默认高亮(当前激活菜单的 index)
router  // 是否使用 vue-router 的模式,启用该模式会在激活导航时以 index 作为 path 进行路由跳转,此时菜单的高亮是menu组件中的index属性和地址栏中的路径匹配到了就会高亮。

1、横向菜单

导航菜单默认为垂直模式,通过mode属性设置成horizontal可以使导航菜单变更为水平模式。

  <el-menu
      :default-active="activeMenu"
      class="el-menu-demo"
      mode="horizontal"
      router
      :background-color="#000"
      text-color="#fff"
      active-text-color="#409eff">
      <el-menu-item index="/home"><i class="iconfont icon-zhuye" style="vertical-align: 0px;"></i> 首页</el-menu-item>
      <el-submenu index="1">
        <template slot="title"><i class="el-icon-monitor"></i>监控</template>
        <el-menu-item index="/monitor/aaa">111111</el-menu-item>
        <el-menu-item index="/monitor/bbb">22222</el-menu-item>
        <el-menu-item index="/monitor/ccc">333333</el-menu-item>
        <el-menu-item index="/monitor/ddd">44444</el-menu-item>
      </el-submenu>
      <el-submenu index="2">
        <template slot="title"><i class="el-icon-s-marketing"></i>CDN</template>
        <el-menu-item index="/cdn/aaa">域名管理</el-menu-item>
        <el-menu-item index="/cdn/bbb">111111</el-menu-item>
        <el-menu-item index="/cdn/ccc">222222</el-menu-item>
        <el-menu-item index="/cdn/ddd">333333</el-menu-item>
      </el-submenu>
      <el-menu-item index="/apiDocument"><i class="iconfont icon-iconset0118"></i> 接口文档</el-menu-item>
  </el-menu>
export default {
  computed: {
  // 我们使用计算属性来获取到当前点击的菜单的路由路径,然后设置default-active中的值
  // 使得菜单在载入时就能对应高亮
    activeMenu() {
      const route = this.$route
      const { meta, path } = route
      // if set path, the sidebar will highlight the path you set
      // 可以在路由配置文件中设置自定义的路由路径到meta.activeMenu属性中,来控制菜单自定义高亮显示
      if (meta.activeMenu) {
        return meta.activeMenu
      }
      return path
    }
  }
}

2、纵向菜单

其实横向菜单和纵向菜单的配置差不多,区别在于去掉mode属性就变成纵向垂直菜单了。高亮配置和横向菜单是一致的。

在纵向菜单的时候如果点击二级菜单高亮了,默认一级菜单不会高亮。

3、嵌套式菜单

嵌套式菜单中我们要同时控制两个分离菜单的高亮,那么在路由配置文件router/index.js中及其重要了,需要在每项路由中设置meta属性的不同字段来控制高亮。

记住:刷新仍能高亮是以路由路径匹配式高亮

结合第一点的横向菜单为主菜单menu配置,特别注意文档接口那一项的index路径。

文档接口页面的纵向菜单配置:

       <el-menu
          :default-active="activeMenu"
          class="el-menu-vertical-demo api-menu"
          router
          @open="handleOpen"
          @close="handleClose"
          background-color="#f8f8f8"
          :default-openeds=defaultOpen
          text-color="#666"
          active-text-color="#409eff">
          <el-submenu index="1">
            <template slot="title">
              <i class="el-icon-s-marketing"></i>
                <span class="bold-font">CDN</span>
            </template>
            <el-menu-item index="/apiDocument/cdnSummary">
                <span class="bold-font">概览</span>
            </el-menu-item>
            <el-submenu index="1-1">
              <template class="sub-drop-title" slot="title"><span class="bold-font">API列表</span> 总数2个</template>
              <el-menu-item class="api-menu-item" index="/apiDocument/pushRefresh">
                <span class="api-item">
                  <span>push_refresh </span>
                  <span style="font-size: 13px;color:#999;">aaaaa</span>
                </span>
              </el-menu-item>
              <el-menu-item class="api-menu-item" index="/apiDocument/refreshTasks">
                <span class="api-item">
                  <span>refresh_tasks </span>
                  <span style="font-size: 13px;color:#999;">bbbbb</span>
                </span>
              </el-menu-item>
            </el-submenu>
          </el-submenu>
        </el-menu>
export default {
  data () {
    return {
      defaultOpen: ['1','1-1'] // 默认展开菜单项
    }
  },
  computed: {
    activeMenu() {
      const route = this.$route
      const { meta, path } = route
      // if set path, the sidebar will highlight the path you set
      if (meta.apiActiveMenu) { // 注意这里很重要
        return meta.apiActiveMenu
      }
      return path
    }
  }
}

router/index.js文件的路由配置(特别关注activeMenu、apiActiveMenu的配置):

routes: [
  // 重定向,打开接口文档页面就重定向到 概览
  {
    path: '/apiDocument',
    redirect: '/apiDocument/cdnSummary',
    hidden: true // 不需要再Menu菜单上显示的就设置这个属性
  },
  // 接口文档路由
  {
   // 接口文档菜单的动态加载配置 start
    path: '',
    name: 'apiDocument',
    component: customerLayout,
    gotoPath: '/apiDocument', // 自定义属性 (主菜单中的index属性值)
    meta: {
      title: '接口文档',
      activeMenu: '/apiDocument'
    },
    showOne: true, // 自定义属性
    hidden: true,
    // 接口文档菜单的动态加载配置 end
    children: [{
      path: '',
      component: apiDoc,
      children: [
        {
          path: '/apiDocument/cdnSummary',
          component: cdnSummary,
          meta: {
            activeMenu: '/apiDocument', // 主菜单 的 接口文档 高亮
            apiActiveMenu: '/apiDocument/cdnSummary' // 接口文档的子菜单高亮
          }
        },
        {
          path: '/apiDocument/pushRefresh',
          component: pushRefresh,
          meta: {
            activeMenu: '/apiDocument',
            apiActiveMenu: '/apiDocument/pushRefresh' // 接口文档的子菜单高亮
          }
        },
        {
          path: '/apiDocument/refreshTasks',
          component: refreshTasks,
          meta: {
            activeMenu: '/apiDocument',
            apiActiveMenu: '/apiDocument/refreshTasks' // 接口文档的子菜单高亮
          }
        }
      ]
    }]
  }
]

实现高亮的思想是

在每次点击纵向菜单时浏览器地址栏中的地址就会改变,这时地址栏就会和apiActiveMenu配置中地址一致,我们使用apiActiveMenu来自定义控制二级对应高亮;

而一级菜单栏由activeMenu来自定义高亮,使得activeMenu配置和一级菜单的index属性中的配置一直一致,这样接口文档内的纵向菜单在切换的时候就不会影响到一级主菜单的高亮了。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Element-ui NavMenu子菜单使用递归生成时使用报错

    当采用递归方式生成导航栏的子菜单时,菜单可以正常生成,但是当鼠标hover时,会出现循环调用某个(mouseenter)事件,导致最后报错 处理方式 注:2.13.2 版本,只需对子菜单设置属性 :popper-append-to-body="false" 就不会出现这个问题了 报错信息如下: Uncaught RangeError: Maximum call stack size exceeded.     at VueComponent.handleMouseenter (inde

  • vue+element导航栏高亮显示的解决方式

    用导航菜单时遇到的一些问题:点击打开官网例子 问题1: 页面强制刷新,按F5时,页面如果没有好好设置的话,导航栏默认叠起来,而且无高亮显示:刷新后导航栏显示和之前不一致,如图所示 解决: html关键代码设置 :default-active="defaultUrl" 这儿的原理就是defaultUrl跟#/后面的一致,也就是说跟router.js中的path一致才行(router.js见后文) window.location.href.split('/#')[1] 获取的是"

  • 解决vue项目刷新后,导航菜单高亮显示的位置不对问题

    1本人在学vue项目时遇到一个坑.在写vue项目头部导航时,比如点击第三个,刷新后,高亮状态显示在第一个: 现在是点击第三个页面 刷新后,是第一个页面高亮显示,但是因为路由路径没有改变页面内容还是第三个页面内容,改变的是导航的状态: 捯饬了好久才搞出来,伤的不轻,看控制导航状态的代码部分: 在头部组件里面控制导航菜单高亮显示是checkindex,默认值是0,触发点击事件contact时候会重新赋值,跳转路由,一旦刷新页面,这个checkindex的值就是0,所以要把这个checkindex值记

  • Element-Ui组件 NavMenu 导航菜单的具体使用

    本文来源于Element官方文档: http://element-cn.eleme.io/#/zh-CN/component/menu 基础用法 普通导航菜单 <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect"> <el-menu-item index=&quo

  • 解决elementui中NavMenu导航菜单高亮问题(解决多种情况)

    目录 前言 我在项目中遇到的情况有三种:(vue-cli+elementui) 1.横向菜单 2.纵向菜单 3.嵌套式菜单 代码实现 1.横向菜单 2.纵向菜单 3.嵌套式菜单 前言 如果使用elementui这个框架来开发系统,那么我们几乎都会使用到NavMenu 组件. 我们可能需要菜单根据我们点击的那一项高亮显示,刷新页面了之后还是会相应的高亮显示. elementUI组件官网: https://element.eleme.io/#/zh-CN/component/menu 我在项目中遇到

  • vue.js使用Element-ui中实现导航菜单

    本文实例为大家分享了vue.js使用Element-ui中实现导航菜单的具体代码,供大家参考,具体内容如下 写这个的原因是因为当时写这个功能时候element只有效果,但是功能没有实现,当时一头雾水 先放图吧 大体实现思路我先讲一下不然下面代码片段会看懵, 圈出来的左右两部分,左边是element复制就可实现, 右边是跳转的子组件. 首先创建导航菜单的vue文件,但这个文件里面只是引入组件,里面使用Container布局容器实现左右两部分,左边el-aside标签中放入导航菜单的组件,右边el-

  • 解决Vue 刷新页面导航显示高亮位置不对问题

    首先:现在是我点击在产品介绍页面 但是当我刷新页面后高亮位置就变成了第一个 在头部组件里面控制导航高亮显示是checked,默认值是0,触发点击事件会重新赋值,跳转路由,当刷新页面,checked值是0,所以要监听checked时刻发生变化:利用到vue的父子和子父传值:监听状态的变化 子页面将值传给父页面 父页面接收传过来的值 父组件把值传给header头部组件,头部组件通过prop接收 所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子

  • Element NavMenu导航菜单的使用方法

    组件-导航菜单 顶栏 <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect"> <el-menu-item index="1">处理中心</el-menu-item> <el-submenu index="2&q

  • Vue+ElementUI 中级联选择器Bug问题的解决

    最近在项目中需要用到级联这么个控件,所以便去element上找了个,发现了个问题,在这里跟大家分享下,介于公司项目的隐私性,所以一些文字便给大家打上马赛克了,敬请谅解~ 不多说废话,直接上问题: ElemenUI的级联是通过子级字段递归进行显示的,但是假如后端老铁也用了递归写的数据,而递归到最后一个数据集便出现了问题,会出现光有字段,但是却没有数据这么个情况在这里插入图片描述 这时候就出现了问题: 最后一级会多出来一个级联,这种体验便造成了很不好的感觉. 解决办法: 将获取这些级联的数据作为参数

  • element-ui中dialog弹窗关闭按钮失效的解决

    如下所示: <el-dialog title="修改库存" :visible.sync="kcDialog" @close="kcDialog = false"> ... </el-dialog> 加一个@close可以是一个方法或者直接操作kcDialog为false 补充知识:webpack外部扩展,依赖前置 引入了外部js index.html <script src="https://code.jq

  • WordPress中制作导航菜单的PHP核心方法讲解

    WordPress 3.0 引入导航菜单功能, 让页面的导航和链接的管理变得简单易用. WP 向用户提供了菜单管理页面和多种调用方法, 我们先来看一下一般WordPress 的导航菜单都具有哪些功能. 管理菜单页面 页面路径: Appearance > Menus 由从界面来看, 能够创建多个菜单, 并且可以向菜单中添加自定义链接, 页面链接和分类链接. 但有一点需要注意, 如果将页面链接和分类链接加入, 被带入菜单的仅是链接, 而不是页面和分类本身, 也就是说, 子页面和子分类不会成为菜单的一

  • 解决element-ui中Popconfirm气泡确认框的事件不生效问题

    目录 element-ui中Popconfirm气泡确认框的事件不生效 (2.15.6版本解决)elementui popconfirm气泡确认事件失效 element-ui中Popconfirm气泡确认框的事件不生效 今天在使用到element-ui中的Popconfirm 气泡确认框组件时,需要在点击确定按钮时触发绑定的事件 按照官方文档提供的事件类型为其绑定的事件,但并没有被触发 以下是官网给出的事件类型 <el-popconfirm title="这是一段内容确定删除吗?"

  • 解决IDEA中 Ctrl+ALT+V这个快捷键无法使用的情况

    这个是由于快捷键冲突造成的: 所以可以查应用 比如: 1)搜狗输入法中设置的语句 2)QQ音乐的快捷键 3)有道词典的快键键 把上面找的快键键删除,那么在IDEA里面就可以使用了 若是查询的时候出现下图时,那么就是可以使用了 补充:ctrl+alt+m被占用.intellij idea中不能用快捷键抽取方法 intellij idea中ctrl+alt+M是jian将代码抽取chen成方法的快捷键.但是我不管怎么按都没有效果,后来发现应该被某程序给全局占用了. 但是一直不知道被哪个程序占用了.在

随机推荐