溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用vue.js怎么實現(xiàn)一個二級菜單效果

發(fā)布時間:2021-04-17 17:34:42 來源:億速云 閱讀:297 作者:Leah 欄目:web開發(fā)

本篇文章為大家展示了使用vue.js怎么實現(xiàn)一個二級菜單效果,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>這是一個v-for的導(dǎo)航條</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: '引導(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的邏輯,可以簡化為,我點擊誰誰就active,其他的菜單項active都變?yōu)?
  * false。但特殊情況為二級菜單,二級菜單點擊后自己的active變?yōu)閠rue,但父菜單項的active不能變false。
  * 所以問題簡化為:
  * 1. 點擊的菜單項的active變?yōu)閠rue
  * 2. 遍歷整個菜單的所有數(shù)據(jù)項,不等于我點擊的這個菜單項的active都變?yōu)閒alse
  * (但二級菜單要考慮其父菜單項不能變false,即除了我點擊的這個和我的父菜單項外都變false)
  *
  * 關(guān)鍵問題即:用樹的遍歷解決菜單所有數(shù)據(jù)項的遍歷和active取反,即對于被遍歷的每個菜單項來說,
  * 只要不等于我傳入的一級菜單和二級菜單,active就變成false
  *
  * 整體邏輯即:menus中的數(shù)據(jù)項,進行遍歷,如果不等于傳入的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>

上述內(nèi)容就是使用vue.js怎么實現(xiàn)一個二級菜單效果,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI