Vue3+Element-Plus 实现点击左侧菜单列表时高亮状态保持的功能 三十

1.实现的效果 

 2.实现高亮状态保持的原理

2.1 根据官网Menu 菜单项里面有一个属性 default-active 

  • default-active    默认激活菜单的 index。并且该属性接收的值是 string 类型

Menu 菜单 | Element Plus (gitee.io)https://element-plus.gitee.io/zh-CN/component/menu.html#menu-%E5%B1%9E%E6%80%A7

小知识 

 default-active 属性的作用就是说,如果点击左侧菜单列表的某一项时,需要给当前点击选中的菜单列表呈现出激活高亮的状态,那么就需要把当前点击选择的菜单项 index 值赋给这个属性。由于index 类型是string, 所以我们可以把菜单项的path 值作为它激活的 index 

 2.2 所以在每一次点击左侧菜单列表时,把对应的菜单项地址保存在 sessionstorage 中,这样就相当于,把需要激活高亮的菜单项地址保存在session 中了。当页面开始加载时或页面刷新的时候,再从 sessionstorage  取出该值,动态赋值给 default-active 从而实现高亮效果。


不理解菜单项地址从那来的,可以参考这章

(7条消息) Vue3+Element-Plus 动态加载主页Aside(左侧)菜单数据 二五_码侬人生-CSDN博客https://blog.csdn.net/weixin_39237340/article/details/121753710

3. 实现的步骤

3.1 保存sessionstorage

1. 首先为 二级菜单添加单击事件,当用户点击菜单列表项时,把对应的path 值存储起来。

 2. 实现单击事件的函数

3. 如上达到效果,当用户点击菜单项列表时,会把值保存在  sessionstorage

 3.2 接着,实现当页面刷新或初始化时,取出保存在 sessionstorage 中的值,实现高亮效果。

1. 首先定义一个activePath 对象,来保存取出来的 Path 值

 2. 接着为定义 activePath 对象动态赋值

 2.1给属性动态赋值的时机也有讲究,分为下面两种形式

  • 在页面创建的时候,调用生命周期函数created为 activePath 对象赋一个初始值

  • 在点击左侧菜单的时候,再次给  activePath 对象动态赋于点击的Path值

3. 最后为左侧栏菜单 Menu 添加   default-active 属性,并使用自定义的对象activePath 为该属性动态赋值绑定

总结

  1. 当点击左侧菜单列表项时,把该菜单项的path 值保存在sessionstorage 中,当下一次刷新页面时,立即取出该值。动态赋给菜单(Menu)的 default-active 属性。

 4. 最终效果,当被点击的选项激活后,刷新了还会保持激活高亮的状态

5. 页面代码

5.1 Home.vue

<template>
  <el-container class="home_container">
    <!-- 头部区域 -->
    <el-header>
      <div>
        <img src="../assets/heima.png" alt="" />
        <span>电商后台管理系统</span>
      </div>
      <el-button type="info" @click="logout">退出</el-button>
    </el-header>
    <!-- 页面主体区域 -->
    <el-container>
      <!-- 侧边栏 -->
      <el-aside :width="isCollapse ? '64px':'200px'">
        <div class="toggle-button" @click="toggleCollapse">|||</div>
        <!-- 侧边栏菜单区域 -->
        <el-menu active-text-color="#409Eff"
        background-color="#545c64"
        text-color="#fff" unique-opened
        :collapse="isCollapse" :collapse-transition="false"
        :router="true" :default-active="activePath">
        <!-- 一级菜单 -->
        <el-submenu :index="item.id+''" v-for="item in menulist" :key="item.id">
          <!-- 一级菜单模板区域 -->
          <template #title>
            <el-icon :class="iconsObj[item.id]"></el-icon>
            <span>{{item.authName}}</span>
          </template>
          <!-- 二级菜单 -->
          <el-menu-item :index="'/'+subItem.path" v-for="subItem in item.children" :key="subItem.id"
          @click="saveNavState('/'+subItem.path)">
          <template #title>
            <el-icon><iconMenu /></el-icon>
            <span>{{subItem.authName}}</span>
          </template>
          </el-menu-item>
        </el-submenu>
      </el-menu>
      </el-aside>
      <!-- 右侧内容主体区域 -->
      <el-main>
        <!-- 路由占位符 -->
        <router-view></router-view>
      </el-main>
    </el-container>
  </el-container>
</template>
<script>
export default {
  data () {
    return {
      // 左侧菜单数据对象
      menulist: [],
      // 字体图标对象
      iconsObj: {
        125: 'iconfont icon-users',
        103: 'iconfont icon-tijikongjian',
        101: 'iconfont icon-shangpin',
        102: 'iconfont icon-danju',
        145: 'iconfont icon-baobiao'
      },
      // 是否折叠
      isCollapse: false,
      // 被激活高亮的链接地址
      activePath: ''
    }
  },
  created () {
    this.getMenuList()
    this.activePath = window.sessionStorage.getItem('activePath')
  },
  methods: {
    logout () {
      window.sessionStorage.clear()
      this.$router.push('/login')
    },
    // 获取所有的菜单数据
    async  getMenuList () {
      const { data: res } = await this.$http.get('menus')
      if (res.meta.status !== 200) return this.$message.error(res.meta.msg)
      // 成功了,进行赋值
      this.menulist = res.data
      console.log(res)
    },
    // 点击按钮,切换菜单的折叠与展开
    toggleCollapse () {
      this.isCollapse = !this.isCollapse
    },
    // 保存链接的激活状态
    saveNavState (activePath) {
      window.sessionStorage.setItem('activePath', activePath)
      this.activePath = window.sessionStorage.getItem('activePath')
    }
  }
}
</script>
<style lang="less" scoped>
.home_container {
  height: 100%;
}
.el-header {
  background-color: #363d40;
  // 给头部设置一下弹性布局
  display: flex;
  // 让它贴标左右对齐
  justify-content: space-between;
  // 清空图片左侧padding
  padding-left: 0;
  // 按钮居中
  align-items: center;
  // 文本颜色
  color: #fff;
  // 设置文本字体大小
  font-size: 20px;
  // 嵌套
  > div {
    // 弹性布局
    display: flex;
    // 纵向上居中对齐
    align-items: center;
    // 给文本和图片添加间距,使用类选择器
    span {
      margin-left: 15px;
    }
  }
}
.el-aside {
  background-color: #313743;
  .el-menu {
    border-right: none;
  }
}
.el-main {
  background-color: #e9edf1;
}
.iconfont{
  margin-right: 10px;
}
.toggle-button{
 // 添加背景颜色
 background-color: #4A5064;
 // 设置文本大小
 font-size:10px;
 // 设置文本行高
 line-height:24px;
 // 设置文本颜色
 color:#fff;
 // 设置文本居中
 text-align: center;
 // 设置文本间距
 letter-spacing: 0.2em;
 // 设置鼠标悬浮变小手效果
 cursor:pointer;
}
</style>

以上出自: 【黑马程序员】前端开发之Vue项目实战_Element-UI【配套源码+笔记】_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1x64y1S7S7?p=42

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小丫头呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值