真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何使用vuex進行菜單管理

這篇文章主要為大家展示了“如何使用vuex進行菜單管理”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“如何使用vuex進行菜單管理”這篇文章吧。

創(chuàng)新互聯(lián)專注于察哈爾右翼中旗企業(yè)網(wǎng)站建設,響應式網(wǎng)站開發(fā),成都商城網(wǎng)站開發(fā)。察哈爾右翼中旗網(wǎng)站建設公司,為察哈爾右翼中旗等地區(qū)提供建站服務。全流程按需定制開發(fā),專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務

vuex 的優(yōu)勢在復雜狀態(tài)管理中才能提現(xiàn)出來。

如果項目中有多級菜單,且不同組件中散布多個相同級別的菜單,項目同一時刻各級菜單有且僅有一個高亮,菜單跳轉(zhuǎn)時除了路由改變,相應菜單也要高亮(之前的恢復非高亮狀態(tài)),這便是個使用 vuex 再好不過的場景。

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

使用 DOM 進行菜單管理,背后的思想是:在點擊菜單的同時,將事件對象傳入事件處理程序,想讓當前高亮的 menu 非高亮,再讓點擊的 menu 高亮。


 注冊
 充值
 購買
 到期
 提現(xiàn)
menuClicked (event, url) {
 // 當前高亮的 menu 非高亮
 const currentActiveLink = this.querySelector('.active');
 currentActiveLink.classList.remove('active');
 // 當前點擊的 menu 高亮
 event.target.classList.add('active');
 // 路由跳轉(zhuǎn)
 this.$router.push(`/panel/list/${url}`);
},

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

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

現(xiàn)在是 vuex 登場的時候了。

使用 vuex 進行菜單管理

使用 vuex 進行菜單管理需要 在開發(fā)前就規(guī)劃好菜單的層級 ,以便在 vuex 分配 state mutations 。

規(guī)劃層級

確定項目中哪些是一級菜單,哪些是二級菜單,以此類推…… 這里要注意的是,為簡化操作,同級別菜單都以不同名稱命名,這樣在 vuex 中就不需要關注菜單屬于那個頁面,只關注狀態(tài)就好。菜單層級通常如下:

|-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 的狀態(tài)管理可以只寫一個 `mutations`,通過傳參判斷是更改哪個層級及對應的 menu。

需要注意的是 vuex 在頁面刷新后狀態(tài)會重新初始化,這顯然和管理菜單所需功能不符(除了主動觸發(fā),其他操作不能對菜單產(chǎn)生影響)??梢酝ㄟ^vuex-persistedstate 改變 vuex 默認生命周期,下面示例代碼將 vuex 狀態(tài)存儲在了 cookie 中:

js

const store = new Vuex.Store({
 state: {
  // 初始化
  activeFirstMenu: 'firstMenu1',
  activeSecondMenu : 'secondMenu1',
 },
 mutations: {
  // 更改一級菜單
  changeFirstActiveMenu (state, menu) {
   state.activeFirstMenu = menu;
  },
  // 更改二級二級菜單
  changeSecondActiveMenu (state, menu) {
   state.activeSecondMenu = menu;
  }
 },
});

組件中渲染

在 template 動態(tài)加載高亮 class,通過 vuex 中 state 控制:


 secondMenu1
 secondMenu2
 secondMenu3

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

data () {
 return {
  // 初始化
  activeMenu: {
   // menu 名稱相同,和對應路由的 path 相同
   secondMenu1: '',
   secondMenu2: '',
   secondMenu3: '',
  },
 };
},
computed: {
 activeMenuName () {
  // 檢測 vuex 中 activeSecondMenu 的變化
  return this.$store.state.activeSecondMenu;
 }
},
methods: {
 menuClicked(path) {
  // 取消當前 tab 高亮
  this.activeMenu[this.activeMenuName] = false;

  // 更新 vuex 狀態(tài)及 menu 高亮
  this.$store.commit("changeSecondActiveMenu", path);
  this.activeMenu[this.activeMenuName] = true;

  // 路由跳轉(zhuǎn) path 和對應 menu 名稱相同 
  this.$router.push(`/somePath/${path}`);
 },
 init () {
  // 刷新頁面重置正確高亮菜單tab
  this.activeMenu[this.activeMenuName] = true;
 },
},
mounted: {
 this.init();
},

其他

對于 vuex 的優(yōu)化

上文有談到,實際工作中為了更大程度實現(xiàn)代碼復用,對于某個類別的狀態(tài)管理可以只寫一個 mutations ,通過傳參(Payload )判斷更改內(nèi)容。還是以 menu 管理為例,可進行下面的優(yōu)化:

vuex 優(yōu)化后如下:

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

 mutations: {
  // 優(yōu)化后代碼,合并 changeFirstActiveMenu 和 changeSecondActiveMenu
  changeActiveMenu (state, menuInfo) {
   state[menuInfo.menuHierarchy] = menuInfo.name;
  }
 }
});

組件 js 部分優(yōu)化后如下:

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

  // 優(yōu)化后代碼:更改一級和二級菜單觸發(fā)同個 mutation
  this.$store.commit("changeActiveMenu", {
   menuHierarchy: 'activeFirstMenu',
   name: path,
  });

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

  // 其他代碼略
 },
},

以上是“如何使用vuex進行菜單管理”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


分享標題:如何使用vuex進行菜單管理
鏈接地址:http://weahome.cn/article/ppphhd.html

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部