vue.js實現(xiàn)二級菜單效果
本文實例為大家分享了vue.js實現(xiàn)二級菜單效果的具體代碼,供大家參考,具體內(nèi)容如下
主要是對二級菜單和當(dāng)前點(diǎn)擊的處理:
點(diǎn)擊導(dǎo)航時,如果有二級菜單,就切換二級菜單顯示狀態(tài)(顯示或者關(guān)閉),如果沒有二級菜單,就變色,表示頁面處于當(dāng)前位置,并且導(dǎo)航中最多只能有一個菜單變色。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>這是一個v-for的導(dǎo)航條</title> <link 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: '引導(dǎo)頁', // url: 'https://www.baidu.com/', icon: 'glyphicon glyphicon-send', active: false }, { text: '權(quán)限測試頁', icon: 'glyphicon glyphicon-lock', downIcon: 'glyphicon glyphicon-menu-down', active: false, secondMenus: [ {text: '頁面權(quán)限', url: '#', active: false}, {text: '權(quán)限指令', url: '#', active: false}, ] }, { text: '圖標(biāo)', icon: 'glyphicon glyphicon-pawn', active: false, // url: 'https://www.baidu.com/' }, ] }, methods: { showToggle: function (menu, secMenu) { // 如果傳入了二級菜單 if (secMenu) { secMenu.active = true; // 更新menus數(shù)據(jù) this.refreshMenuTree(this.menus, menu, secMenu); } else { if (menu.secondMenus) { menu.active = !menu.active; } else { menu.active = true; // 更新menus數(shù)據(jù) this.refreshMenuTree(this.menus, menu, secMenu); } } }, /** * 解釋:對于菜單欄active置為true的邏輯,可以簡化為,我點(diǎn)擊誰誰就active,其他的菜單項active都變?yōu)? * false。但特殊情況為二級菜單,二級菜單點(diǎn)擊后自己的active變?yōu)閠rue,但父菜單項的active不能變false。 * 所以問題簡化為: * 1. 點(diǎn)擊的菜單項的active變?yōu)閠rue * 2. 遍歷整個菜單的所有數(shù)據(jù)項,不等于我點(diǎn)擊的這個菜單項的active都變?yōu)閒alse * (但二級菜單要考慮其父菜單項不能變false,即除了我點(diǎn)擊的這個和我的父菜單項外都變false) * * 關(guān)鍵問題即:用樹的遍歷解決菜單所有數(shù)據(jù)項的遍歷和active取反,即對于被遍歷的每個菜單項來說, * 只要不等于我傳入的一級菜單和二級菜單,active就變成false * * 整體邏輯即:menus中的數(shù)據(jù)項,進(jìn)行遍歷,如果不等于傳入的menu或者secMenu則直接置為false * @param menus 包含menu數(shù)據(jù)項的數(shù)組,如一級菜單數(shù)組,二級菜單數(shù)組 * @param menu 應(yīng)該激活的一級菜單項 * @param secMenu 應(yīng)該激活的二級菜單項 */ 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)給函數(shù)的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 插件。你也可以根據(jù)需要只加載單個插件。 --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script> </body> </html>
更多教程點(diǎn)擊《Vue.js前端組件學(xué)習(xí)教程》,歡迎大家學(xué)習(xí)閱讀。
關(guān)于vue.js組件的教程,請大家點(diǎn)擊專題vue.js組件學(xué)習(xí)教程進(jìn)行學(xué)習(xí)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue3.2?reactive函數(shù)問題小結(jié)
reactive用來包裝一個對象,使其每個對象屬性都具有響應(yīng)性(也就是深層次響應(yīng)式),這篇文章主要介紹了vue3.2?reactive函數(shù)注意點(diǎn)及問題小結(jié),需要的朋友可以參考下2022-12-12npm run serve運(yùn)行vue項目時報錯:Error: error:0308010C
這篇文章主要介紹了npm run serve運(yùn)行vue項目時,出現(xiàn)報錯:Error: error:0308010C:digital envelope routines::unsupported的解決方法,文中有詳細(xì)的解決方法,需要的朋友可以參考下2024-04-04原生JS?Intersection?Observer?API實現(xiàn)懶加載
這篇文章主要為大家介紹了原生JS?Intersection?Observer?API實現(xiàn)懶加載示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07vue+ElementUI實現(xiàn)訂單頁動態(tài)添加產(chǎn)品數(shù)據(jù)效果實例代碼
本篇文章主要介紹了vue+ElementUI實現(xiàn)訂單頁動態(tài)添加產(chǎn)品效果實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07