您的位置:首页 > Web前端 > Vue.js

vue.js实现二级菜单效果

2019-10-19 18:06 1351 查看

本文实例为大家分享了vue.js实现二级菜单效果的具体代码,供大家参考,具体内容如下

主要是对二级菜单和当前点击的处理:

点击导航时,如果有二级菜单,就切换二级菜单显示状态(显示或者关闭),如果没有二级菜单,就变色,表示页面处于当前位置,并且导航中最多只能有一个菜单变色。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这是一个v-for的导航条</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.min.js"></script>
<link rel="stylesheet" href="nav.css" >
</head>
<body>
<div id="pages">
<ul id="side-menu">
<li class="menu-unit" v-for="menu in menus">
<a id="menu-url" v-bind:href="menu.url"
v-bind:class="{ 'menu-active': menu.active && !menu.secondMenus}"
v-on:click="showToggle(menu)"
>
<i v-bind:class="menu.icon"></i>
<span>{{ menu.text }}</span>
<i v-if="menu.downIcon" v-bind:class="menu.downIcon"></i>
</a>
<ul id="side-second-menu" v-if="menu.secondMenus && menu.active">
<li v-for="secMenu in menu.secondMenus" v-on:click="showToggle(menu, secMenu)">
<a v-bind:href="secMenu.url" rel="external nofollow"
v-bind:class="{ 'menu-active': secMenu.active }">
<span>{{ secMenu.text }}</span>
</a>
</li>
</ul>
</li>
</ul>
</div>

<script>
var vm = new Vue({
el: '#side-menu',
data: {
menus: [
{
text: '首页',
icon: 'glyphicon glyphicon-apple',
active: false
},
{
text: '文档',
// url: 'https://www.baidu.com/',
icon: 'glyphicon glyphicon-book',
active: false
},
{
text: '引导页',
// url: 'https://www.baidu.com/',
icon: 'glyphicon glyphicon-send',
active: false
},
{
text: '权限测试页',
icon: 'glyphicon glyphicon-lock',
downIcon: 'glyphicon glyphicon-menu-down',
active: false,
secondMenus: [
{text: '页面权限', url: '#', active: false},
{text: '权限指令', url: '#', active: false},
]
},
{
text: '图标',
icon: 'glyphicon glyphicon-pawn',
active: false,
// url: 'https://www.baidu.com/'
},
]
},
methods: {
showToggle: function (menu, secMenu) {
// 如果传入了二级菜单
if (secMenu) {
secMenu.active = true;
// 更新menus数据
this.refreshMenuTree(this.menus, menu, secMenu);
} else {
if (menu.secondMenus) {
menu.active = !menu.active;
} else {
menu.active = true;
// 更新menus数据
this.refreshMenuTree(this.menus, menu, secMenu);
}
}
},

/**
* 解释:对于菜单栏active置为true的逻辑,可以简化为,我点击谁谁就active,其他的菜单项active都变为
* false。但特殊情况为二级菜单,二级菜单点击后自己的active变为true,但父菜单项的active不能变false。
* 所以问题简化为:
* 1. 点击的菜单项的active变为true
* 2. 遍历整个菜单的所有数据项,不等于我点击的这个菜单项的active都变为false
* (但二级菜单要考虑其父菜单项不能变false,即除了我点击的这个和我的父菜单项外都变false)
*
* 关键问题即:用树的遍历解决菜单所有数据项的遍历和active取反,即对于被遍历的每个菜单项来说,
* 只要不等于我传入的一级菜单和二级菜单,active就变成false
*
* 整体逻辑即:menus中的数据项,进行遍历,如果不等于传入的menu或者secMenu则直接置为false
* @param menus 包含menu数据项的数组,如一级菜单数组,二级菜单数组
* @param menu 应该激活的一级菜单项
* @param secMenu 应该激活的二级菜单项
*/
refreshMenuTree(menus, menu, secMenu) {
// 开始遍历
menus.forEach(function (item) {
// 如果菜单项不等于传入的一级菜单项或二级菜单项,则active置为false
if (!(item === menu || item === secMenu || (item.secondMenus && item.active))) {
item.active = false;
}

// 如果菜单项包含二级菜单列表,则遍历此列表
if (item.secondMenus) {
this.refreshMenuTree(item.secondMenus, menu, secMenu);
}
// 使用.bind(this)给函数的this绑定为外层的作用域,要不然this.refreshMenuTree方法取不到
}.bind(this));
},

}
})
</script>

<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>

</body>
</html>

更多教程点击《Vue.js前端组件学习教程》,欢迎大家学习阅读。

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助

您可能感兴趣的文章:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vue.js 二级菜单