本篇文章为大家展示了使用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怎么实现一个二级菜单效果,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。