首頁 web前端 js教程 如何使用vuex實現選單管理

如何使用vuex實現選單管理

Jun 19, 2018 pm 02:36 PM
vuex 選單 選單管理

本篇文章主要介紹了詳解使用vuex進行選單管理,現在分享給大家,也給大家做個參考。

vuex 的優勢在複雜狀態管理中才能提現出來。

如果專案中有多級選單,且不同元件中散佈多個相同等級的選單,專案同一時刻各級選單有且僅有一個高亮,選單跳轉時除了路由改變,對應選單也要高亮(之前的恢復非高亮狀態),這便是個使用vuex 再好不過的場景。

使用DOM 操作進行簡單選單管理

使用DOM 進行選單管理,背後的想法是:在點擊選單的同時,將事件物件傳入事件處理程序,想讓目前高亮的menu 非高亮,再讓點擊的menu 高亮。

<p class="menu-url">
 <span class="active userList" @click="menuClicked($event, &#39;userList&#39;)">注册</span>
 <span class="chargeList" @click="menuClicked($event, &#39;chargeList&#39;)">充值</span>
 <span class="buyList" @click="menuClicked($event, &#39;buyList&#39;)">购买</span>
 <span class="bangList" @click="menuClicked($event, &#39;bangList&#39;)">到期</span>
 <span class="withDrawList" @click="menuClicked($event, &#39;withDrawList&#39;)">提现</span>
</p>
登入後複製
menuClicked (event, url) {
 // 当前高亮的 menu 非高亮
 const currentActiveLink = this.querySelector(&#39;.active&#39;);
 currentActiveLink.classList.remove(&#39;active&#39;);
 // 当前点击的 menu 高亮
 event.target.classList.add(&#39;active&#39;);
 // 路由跳转
 this.$router.push(`/panel/list/${url}`);
},
登入後複製

這樣雖然實現了點擊切換時menu 高亮,但有一個bug:每次初始化都會使預設的menu 變成高亮,如果此時在非預設高亮的menu 中用戶手動刷新頁面,會導致menu 高亮錯誤(例如在buylist 頁面刷新頁面後,頁面內容依然停留在buylist,但高亮的菜單卻變成了userlist)。

如果要解決這個bug,就需要在本地儲存(刷新不改變儲存狀態) menu 狀態,本地儲存可以選擇不同的方案,在此不做討論,但可以肯定的是DOM 本地儲存控制menu 高亮的方案在專案逐漸變大以後會變得難以維護。

現在是 vuex 登場的時候了。

使用vuex 進行選單管理

使用vuex 進行選單管理需要在開發前就規劃好選單的層級,以便在vuex 中分配state mutations

規劃層級

確定專案中哪些是一級選單,哪些是二級選單,以此類推… 這裡要注意的是,為簡化操作,同等級選單都以不同名稱命名,這樣在vuex 中就不需要專注在選單屬於那個頁面,只專注在狀態就好。選單層級通常如下:

|-root
| |
| |-first-menu1
| |   |- second-menu1
| |   |- second-menu2
| |   |- second-menu3
| |
| |-first-menu2
|    |- second-menu3
|    |- second-menu4
|    |- second-menu5
登入後複製

在vuex 指派`state` 和`mutations` 

不同層級的選單分別佔用一個`state`,至於`mutations`,本例不同`state` 分別對應寫了一個`mutations`,實際工作中為了更大成都減少程式碼復用,對於menu 的狀態管理可以只寫一個`mutations`,透過傳參判斷是更改哪個層級及對應的menu。

要注意的是 vuex 在頁面刷新後狀態會重新初始化,這顯然和管理選單所需功能不符(除了主動觸發,其他操作不能對選單產生影響)。可以透過vuex-persistedstate 改變vuex 預設生命週期,下面範例程式碼將vuex 狀態儲存在了cookie 中:

js

const store = new Vuex.Store({
 state: {
  // 初始化
  activeFirstMenu: &#39;firstMenu1&#39;,
  activeSecondMenu : &#39;secondMenu1&#39;,
 },
 mutations: {
  // 更改一级菜单
  changeFirstActiveMenu (state, menu) {
   state.activeFirstMenu = menu;
  },
  // 更改二级二级菜单
  changeSecondActiveMenu (state, menu) {
   state.activeSecondMenu = menu;
  }
 },
});
登入後複製

元件中渲染

在template 動態載入高亮class,透過vuex 中state 控制:

<p class="subMenu">
 <span :class="{ activeSecondMenu: activeMenu.secondMenu1 }" @click="menuClicked(&#39;secondMenu1&#39;)">secondMenu1</span>
</p>
<p class="subMenu">
 <span :class="{ activeSecondMenu: activeMenu.secondMenu2 }" @click="menuClicked(&#39;secondMenu2&#39;)">secondMenu2</span>
</p>
<p class="subMenu">
 <span :class="{ activeSecondMenu: activeMenu.secondMenu3 }" @click="menuClicked(&#39;secondMenu3&#39;)">secondMenu3</span>
</p>
登入後複製

寫js 時有個技巧:路由path 和對應高亮的menu 名稱最好相同,因為路由跳轉和高亮menu 直接相關,這樣可以減少一個參數:

data () {
 return {
  // 初始化
  activeMenu: {
   // menu 名称相同,和对应路由的 path 相同
   secondMenu1: &#39;&#39;,
   secondMenu2: &#39;&#39;,
   secondMenu3: &#39;&#39;,
  },
 };
},
computed: {
 activeMenuName () {
  // 检测 vuex 中 activeSecondMenu 的变化
  return this.$store.state.activeSecondMenu;
 }
},
methods: {
 menuClicked(path) {
  // 取消当前 tab 高亮
  this.activeMenu[this.activeMenuName] = false;

  // 更新 vuex 状态及 menu 高亮
  this.$store.commit("changeSecondActiveMenu", path);
  this.activeMenu[this.activeMenuName] = true;

  // 路由跳转 path 和对应 menu 名称相同 
  this.$router.push(`/somePath/${path}`);
 },
 init () {
  // 刷新页面重置正确高亮菜单tab
  this.activeMenu[this.activeMenuName] = true;
 },
},
mounted: {
 this.init();
},
登入後複製

其他

#對於vuex 的最佳化

上文有談到,實際工作中為了更大程度實現程式碼重複使用,對於某個類別的狀態管理可以只寫一個mutations ,透過傳參(Payload )判斷更改內容。還是以menu 管理為例,可進行下面的最佳化:

vuex 最佳化後如下:

const store = new Vuex.Store({
 // 其他代码略

 mutations: {
  // 优化后代码,合并 changeFirstActiveMenu 和 changeSecondActiveMenu
  changeActiveMenu (state, menuInfo) {
   state[menuInfo.menuHierarchy] = menuInfo.name;
  }
 }
});
登入後複製

元件js 部分最佳化後如下:

methods: {
 menuClicked(path) {
  // 其他代码略高亮

  // 优化后代码:更改一级和二级菜单触发同个 mutation
  this.$store.commit("changeActiveMenu", {
   menuHierarchy: &#39;activeFirstMenu&#39;,
   name: path,
  });

  this.$store.commit("changeActiveMenu", {
   menuHierarchy: &#39;activeSecondMenu&#39;,
   name: path,
  });

  // 其他代码略
 },
},
登入後複製

上面是我整理給大家的,希望今後對大家有幫助。

相關文章:

使用React如何防止重複渲染

#使用vue如何實作grid-layout功能

詳細介紹在Bootstrap中為Modal新增拖曳功能

#在JS中如何實作預覽效果

##使用three.js製作一個專案

以上是如何使用vuex實現選單管理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Windows 11: 匯入和匯出開始佈局的簡單方法 Windows 11: 匯入和匯出開始佈局的簡單方法 Aug 22, 2023 am 10:13 AM

在Windows11中,「開始」功能表經過重新設計,並具有一組簡化的應用,這些應用程式排列在頁面網格中,這與它的前身不同,後者在「開始」功能表上有資料夾、應用程式和組。您可以自訂「開始」功能表佈局,並將其匯入並匯出至其他Windows設備,以根據您的喜好進行個人化設定。在本指南中,我們將討論在Windows11上匯入開始佈局以自訂預設佈局的逐步說明。什麼是Windows11中的Import-StartLayout?導入開始佈局是Windows10和更早版本中使用的cmdlet,用於將「開始」功能表的自定

如何在Windows 11的右鍵選單中預設'顯示更多選項” 如何在Windows 11的右鍵選單中預設'顯示更多選項” Jul 10, 2023 pm 12:33 PM

我們用戶從來不想要的最煩人的更改之一是在右鍵單擊上下文功能表中包含“顯示更多選項”。但是,您可以刪除它並取回Windows11中的經典上下文功能表。不再需要多次點擊並在上下文選單中尋找這些ZIP捷徑。請依照本指南返回Windows11上成熟的右鍵點選上下文功能表。修復1–手動調整CLSID這是我們清單中唯一的手動方法。您將在登錄編輯器中調整特定鍵或值以解決此問題。注意–像這樣的註冊表編輯非常安全,並且可以正常工作。因此,在系統上嘗試此操作之前,您應該建立註冊表備份。步驟1–嘗試

如何從 Windows 11 中的右鍵單擊上下文功能表中刪除「在 Windows 終端機中開啟」選項 如何從 Windows 11 中的右鍵單擊上下文功能表中刪除「在 Windows 終端機中開啟」選項 Apr 13, 2023 pm 06:28 PM

預設情況下,Windows 11 右鍵單擊上下文功能表有一個名為Open in Windows Terminal的選項。這是一個非常有用的功能,可讓使用者在特定位置開啟 Windows 終端。例如,如果您右鍵單擊資料夾並選擇「在 Windows 終端機中開啟」選項,則 Windows 終端將啟動並將該特定位置設為其目前工作目錄。儘管這是一個了不起的功能,但並不是每個人都發現此功能的用途。一些用戶可能只是不希望在他們的右鍵單擊上下文功能表中使用此選項,並且希望將其刪除以整理他們的右鍵單擊上下文菜

純CSS實現帶有陰影效果的選單導覽列的實現步驟 純CSS實現帶有陰影效果的選單導覽列的實現步驟 Oct 16, 2023 am 08:27 AM

純CSS實現帶有陰影效果的選單導覽列的實現步驟,需要具體程式碼範例在網頁設計中,選單導覽列是一個非常常見的元素。透過為選單導覽列添加陰影效果,不僅可以增加其美觀度,還可以提升使用者體驗。在本文中,我們將使用純CSS來實現一個帶有陰影效果的選單導覽欄,並提供具體的程式碼範例供參考。實作步驟如下:建立HTML結構首先,我們需要建立一個基本的HTML結構來容納選單導覽列。以

如何在iPhone上編輯訊息 如何在iPhone上編輯訊息 Dec 18, 2023 pm 02:13 PM

iPhone上的原生「訊息」應用程式可讓您輕鬆編輯已傳送的文字。這樣,您可以糾正您的錯誤、標點符號,甚至是自動更正可能已應用於您的文字的錯誤短語/單字。在這篇文章中,我們將了解如何在iPhone上編輯訊息。如何在iPhone上編輯訊息必需:運行iOS16或更高版本的iPhone。您只能在「訊息」應用程式上編輯iMessage文本,並且只能在發送原始文字後的15分鐘內編輯。不支援非iMessage資訊文本,因此無法檢索或編輯它們。在iPhone上啟動訊息應用程式。在「訊息」中,選擇要從中編輯訊息的對話

在Vue應用中使用vuex時出現「Error: [vuex] do not mutate vuex store state outside mutation handlers.」怎麼解決? 在Vue應用中使用vuex時出現「Error: [vuex] do not mutate vuex store state outside mutation handlers.」怎麼解決? Jun 24, 2023 pm 07:04 PM

在Vue應用程式中,使用vuex是常見的狀態管理方式。然而,在使用vuex時,我們有時可能會遇到這樣的錯誤提示:「Error:[vuex]donotmutatevuexstorestateoutsidemutationhandlers.」這個錯誤提示是什麼意思呢?為什麼會出現這個錯誤提示?如何解決這個錯誤?本文將詳細介紹這個問題。錯誤提示的含

Vue2.x中使用Vuex管理全域狀態的最佳實踐 Vue2.x中使用Vuex管理全域狀態的最佳實踐 Jun 09, 2023 pm 04:07 PM

Vue2.x是目前最受歡迎的前端框架之一,它提供了Vuex作為管理全域狀態的解決方案。使用Vuex能夠使得狀態管理更加清晰、易於維護,以下將介紹Vuex的最佳實踐,幫助開發者更好地使用Vuex以及提高程式碼品質。 1.使用模組化組織狀態Vuex使用單一狀態樹管理應用程式的全部狀態,將狀態從元件中抽離出來,使得狀態管理更加清晰易懂。在具有較多狀態的應用中,必須使用模組

Vue3中Vuex怎麼使用 Vue3中Vuex怎麼使用 May 14, 2023 pm 08:28 PM

Vuex是做什麼的? Vue官方:狀態管理工具狀態管理是什麼?需要在多個元件中共享的狀態、且是響應式的、一個變,全都改變。例如一些全域要用的狀態資訊:使用者登入狀態、使用者名稱、地理位置資訊、購物車中商品、等等這時候我們就需要這麼一個工具來進行全域的狀態管理,Vuex就是這樣的一個工具。單一頁面的狀態管理View–>Actions—>State視圖層(view)觸發操作(action)變更狀態(state)回應回視圖層(view)vuex(Vue3.

See all articles