Vue3+Element-Plus 实现点击左侧菜单列表时高亮状态保持的功能 三十
1.实现的效果2.实现高亮状态保持的原理2.1 结合官网Menu 菜单项里面有一个属性 default-activedefault-active默认激活菜单的 index。并且该属性接收的值是 string 类型小知识default-active 属性的作用就是说,如果点击左侧菜单列表的某一项时,需要给当前点击选中的菜单列表呈现出激活高亮的状态,那么就需要把当前点击选择的菜单项index 值赋给这
·
1.实现的效果
2.实现高亮状态保持的原理
2.1 根据官网Menu 菜单项里面有一个属性 default-active
- default-active 默认激活菜单的 index。并且该属性接收的值是 string 类型
小知识
default-active 属性的作用就是说,如果点击左侧菜单列表的某一项时,需要给当前点击选中的菜单列表呈现出激活高亮的状态,那么就需要把当前点击选择的菜单项 index 值赋给这个属性。由于index 类型是string, 所以我们可以把菜单项的path 值作为它激活的 index
2.2 所以在每一次点击左侧菜单列表时,把对应的菜单项地址保存在 sessionstorage 中,这样就相当于,把需要激活高亮的菜单项地址保存在session 中了。当页面开始加载时或页面刷新的时候,再从 sessionstorage 取出该值,动态赋值给 default-active 从而实现高亮效果。
不理解菜单项地址从那来的,可以参考这章
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 为该属性动态赋值绑定
总结
-
当点击左侧菜单列表项时,把该菜单项的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>
更多推荐
所有评论(0)