vuex 的優勢在復雜狀態管理中才能提現出來。
如果項目中有多級菜單,且不同組件中散布多個相同級別的菜單,項目同一時刻各級菜單有且僅有一個高亮,菜單跳轉時除了路由改變,相應菜單也要高亮(之前的恢復非高亮狀態),這便是個使用 vuex 再好不過的場景。
使用 DOM 操作進行簡單菜單管理
使用 DOM 進行菜單管理,背后的思想是:在點擊菜單的同時,將事件對象傳入事件處理程序,想讓當前高亮的 menu 非高亮,再讓點擊的 menu 高亮。
<div class="menu-url"> <span class="active userList" @click="menuClicked($event, 'userList')">注冊</span> <span class="chargeList" @click="menuClicked($event, 'chargeList')">充值</span> <span class="buyList" @click="menuClicked($event, 'buyList')">購買</span> <span class="bangList" @click="menuClicked($event, 'bangList')">到期</span> <span class="withDrawList" @click="menuClicked($event, 'withDrawList')">提現</span></div>
menuClicked (event, url) { // 當前高亮的 menu 非高亮 const currentActiveLink = this.querySelector('.active'); currentActiveLink.classList.remove('active'); // 當前點擊的 menu 高亮 event.target.classList.add('active'); // 路由跳轉 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。
新聞熱點
疑難解答
圖片精選