vue.js实现二级菜单效果


Posted in Javascript onOctober 19, 2019

本文实例为大家分享了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组件学习教程进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS类中定义原型方法的两种实现的区别
Mar 08 Javascript
JavaScript 继承详解 第一篇
Aug 30 Javascript
js中数组排序sort方法的原理分析
Nov 20 Javascript
JS实现从表格中动态删除指定行的方法
Mar 31 Javascript
大白话讲解JavaScript的Promise
Apr 06 Javascript
bootstrap timepicker在angular中取值并转化为时间戳
Jun 13 Javascript
详解Vue.js搭建路由报错 router.map is not a function
Jun 27 Javascript
微信小程序视图template模板引用的实例详解
Sep 20 Javascript
原生JS实现的雪花飘落动画效果
May 03 Javascript
Vue加载json文件的方法简单示例
Jan 28 Javascript
使用JS判断页面是首次被加载还是刷新
May 26 Javascript
微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)
Jun 11 Javascript
vue实现多级菜单效果
Oct 19 #Javascript
vue.js实现三级菜单效果
Oct 19 #Javascript
vue.js实现只能输入数字的输入框
Oct 19 #Javascript
Vue数字输入框组件的使用方法
Oct 19 #Javascript
微信小程序实现禁止分享代码实例
Oct 19 #Javascript
Vue.js组件props数据验证实现详解
Oct 19 #Javascript
Vue.js组件使用props传递数据的方法
Oct 19 #Javascript
You might like
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
PHP开发的一些注意点总结
2010/10/12 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
2019/07/18 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
javascript实现的HashMap类代码
2014/06/27 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
深入理解javascript的getTime()方法
2017/02/16 Javascript
微信小程序之数据双向绑定与数据操作
2017/05/12 Javascript
详解Vue路由开启keep-alive时的注意点
2017/06/20 Javascript
JavaScript代码执行的先后顺序问题
2017/10/29 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
vue组件中的数据传递方法
2018/05/14 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
从0到1构建vueSSR项目之路由的构建
2019/03/07 Javascript
在小程序中推送模板消息的实现方法
2019/07/22 Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
2020/04/11 Javascript
用Python的pandas框架操作Excel文件中的数据教程
2015/03/31 Python
python简单分割文件的方法
2015/07/30 Python
pytorch + visdom 处理简单分类问题的示例
2018/06/04 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
Python字符串内置函数功能与用法总结
2019/04/16 Python
python求平均数、方差、中位数的例子
2019/08/22 Python
Python实现微信中找回好友、群聊用户撤回的消息功能示例
2019/08/23 Python
python-tornado的接口用swagger进行包装的实例
2019/08/29 Python
pygame编写音乐播放器的实现代码示例
2019/11/19 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
2020/07/03 Python
html5简介_动力节点Java学院整理
2017/07/07 HTML / CSS
大学生创业感言
2014/01/25 职场文书
《草虫的村落》教学反思
2014/02/16 职场文书
安全横幅标语
2014/06/09 职场文书
2015年成本会计工作总结
2015/10/14 职场文书
2016感恩母亲节校园广播稿
2015/12/17 职场文书