最近写项目用到了这个功能,现在来和大家分享一下
首先我的NavMenu组件,和el-header中的控制菜单展开收起的hambuger按钮是两个分别封装过的组件,是兄弟关系。
NavMenu组件封装的代码如下:
<template>
<div class="side">
<h5 class="title" v-show="!collapse">学生证后台管理系统</h5>
<el-menu
default-active="admin"
class="el-menu-vertical-demo"
background-color="#191a23"
:unique-opened="true"
:router="true"
text-color="#fff"
active-text-color="#4d70ff"
:collapse="collapse"
>
<el-menu-item index="/admin">
<i class="el-icon-s-home"></i>
<span>首页</span>
</el-menu-item>
<el-submenu index="1" >
<template slot="title">
<i class="el-icon-location"></i>
<span>单位管理</span>
</template>
<el-menu-item-group>
<el-menu-item index="/admin/school">添加学校</el-menu-item>
<el-menu-item index="/admin/grade">添加年级</el-menu-item>
<el-menu-item index="/admin/class">添加班级</el-menu-item>
</el-menu-item-group>
</el-submenu>
<el-submenu index="2" >
<template slot="title">
<i class="el-icon-user-solid"></i>
<span>教师管理</span>
</template>
<el-menu-item-group>
<el-menu-item index="/admin/headmaster">班主任</el-menu-item>
<el-menu-item index="/admin/teachers">教师</el-menu-item>
<el-menu-item index="/admin/manage">年级管理者</el-menu-item>
<el-menu-item index="/admin/principal">校长</el-menu-item>
</el-menu-item-group>
</el-submenu>
<el-submenu index="3">
<template slot="title">
<i class="el-icon-s-promotion"></i>
<span>通知</span>
</template>
<el-menu-item-group>
<el-menu-item index="/admin/regular">定时通知</el-menu-item>
<el-menu-item index="/admin/temporary">临时通知</el-menu-item>
</el-menu-item-group>
</el-submenu>
</el-menu>
</div>
</template>
<script>
import bus from '@/assets/js/bus'
export default {
data(){
return{
collapse:false
}
},
created(){
bus.$on('toggleClick',msg=>{
this.collapse=msg
})
}
};
</script>
<style lang="less" scoped>
.title {
color: #fff;
font-size: 20px;
height: 40px;
line-height: 40px;
}
.el-menu-vertical-demo {
text-align: left;
}
.el-submenu,
.el-menu,
.el-menu-item-group,
.el-menu-item {
width: 200px;
}
</style>
hambuger封装的代码如下:
<template>
<div style="padding: 0 15px;" @click="toggleClick">
<svg
:class="{'is-active':isActive}"
class="hamburger"
viewBox="0 0 1024 1024"
xmlns="http://www.w3.org/2000/svg"
width="64"
height="64"
>
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z" />
</svg>
</div>
</template>
<script>
import bus from '@/assets/js/bus'
export default {
name: 'Hamburger',
data(){
return{
isActive:false
}
},
methods: {
toggleClick() {
this.isActive = !this.isActive
bus.$emit('toggleClick',this.isActive)
}
}
}
</script>
<style scoped>
.hamburger {
display: inline-block;
vertical-align: middle;
width: 20px;
height: 20px;
}
.hamburger.is-active {
transform: rotate(180deg);
}
</style>
在components/index.js下实现全局注册:
import sidebar from '@/components/sidebar'
import breadcrumb from '@/components/Breadcrumb'
import dropdown from '@/components/dropdown'
import hamburger from '@/components/Hamburger'
import Vue from 'vue'
export default(Vue)=>{
Vue.component('sidebar',sidebar)
Vue.component('breadcrumb',breadcrumb)
Vue.component('dropdown',dropdown)
Vue.component('hamburger',hamburger)
}
最重要的步骤来啦!!!
通过el-menu的collapse属性来控制菜单栏的展开与收起
我是通过点击hamburge按钮来控制菜单栏的展开与收起,通过EvenBus来实现兄弟组件间的传值。具体步骤如下:
1.在assets/js下边创建bus.js文件
import Vue from 'vue'
// 使用evenbus
const bus = new Vue()
export default bus
2.在hamburge组件中通过触发toggleClick发送要传的参数
3.在NavMenu组件中接收 ,来实现菜单栏的展开与收起
4.在el-sider中也要使用EvenBus传来的参数来实现,侧边栏宽度的变化
如有错误希望大家多多指教~