最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解使用vuex進(jìn)行菜單管理

 更新時(shí)間:2017年12月21日 09:17:14   作者:劉小光  
本篇文章主要介紹了詳解使用vuex進(jìn)行菜單管理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

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

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

使用 DOM 操作進(jìn)行簡(jiǎn)單菜單管理

使用 DOM 進(jìn)行菜單管理,背后的思想是:在點(diǎn)擊菜單的同時(shí),將事件對(duì)象傳入事件處理程序,想讓當(dāng)前高亮的 menu 非高亮,再讓點(diǎn)擊的 menu 高亮。

<div class="menu-url">
 <span class="active userList" @click="menuClicked($event, 'userList')">注冊(cè)</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')">提現(xiàn)</span>
</div>
menuClicked (event, url) {
 // 當(dāng)前高亮的 menu 非高亮
 const currentActiveLink = this.querySelector('.active');
 currentActiveLink.classList.remove('active');
 // 當(dāng)前點(diǎn)擊的 menu 高亮
 event.target.classList.add('active');
 // 路由跳轉(zhuǎn)
 this.$router.push(`/panel/list/${url}`);
},

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

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

現(xiàn)在是 vuex 登場(chǎng)的時(shí)候了。

使用 vuex 進(jìn)行菜單管理

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

規(guī)劃層級(jí)

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

|-root
| |
| |-first-menu1
| |   |- second-menu1
| |   |- second-menu2
| |   |- second-menu3
| |
| |-first-menu2
|    |- second-menu3
|    |- second-menu4
|    |- second-menu5

在 vuex 分配 `state` 和 `mutations` 

不同層級(jí)的菜單分別占用一個(gè) `state`,至于 `mutations`,本例中不同 `state` 分別對(duì)應(yīng)寫了一個(gè) `mutations`,實(shí)際工作中為了更大成都減少代碼復(fù)用,對(duì)于 menu 的狀態(tài)管理可以只寫一個(gè) `mutations`,通過傳參判斷是更改哪個(gè)層級(jí)及對(duì)應(yīng)的 menu。

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

js

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

組件中渲染

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

<div class="subMenu">
 <span :class="{ activeSecondMenu: activeMenu.secondMenu1 }" @click="menuClicked('secondMenu1')">secondMenu1</span>
</div>
<div class="subMenu">
 <span :class="{ activeSecondMenu: activeMenu.secondMenu2 }" @click="menuClicked('secondMenu2')">secondMenu2</span>
</div>
<div class="subMenu">
 <span :class="{ activeSecondMenu: activeMenu.secondMenu3 }" @click="menuClicked('secondMenu3')">secondMenu3</span>
</div>

寫 js 時(shí)有個(gè)技巧:路由 path 和對(duì)應(yīng)高亮的 menu 名稱最好相同,因?yàn)槁酚商D(zhuǎn)和高亮 menu 直接相關(guān),這樣可以減少一個(gè)參數(shù):

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

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

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

其他

對(duì)于 vuex 的優(yōu)化

上文有談到,實(shí)際工作中為了更大程度實(shí)現(xiàn)代碼復(fù)用,對(duì)于某個(gè)類別的狀態(tài)管理可以只寫一個(gè) mutations ,通過傳參(Payload )判斷更改內(nèi)容。還是以 menu 管理為例,可進(jìn)行下面的優(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)化后代碼:更改一級(jí)和二級(jí)菜單觸發(fā)同個(gè) mutation
  this.$store.commit("changeActiveMenu", {
   menuHierarchy: 'activeFirstMenu',
   name: path,
  });

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

  // 其他代碼略
 },
},

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Vue3?父組件調(diào)用子組件方法($refs?在setup()、<script?setup>?中使用)

    詳解Vue3?父組件調(diào)用子組件方法($refs?在setup()、<script?setup>?中使用)

    這篇文章主要介紹了Vue3?父組件調(diào)用子組件方法($refs?在setup()、<script?setup>?中使用),在 vue2 中 ref 被用來獲取對(duì)應(yīng)的子元素,然后調(diào)用子元素內(nèi)部的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Vue2.0實(shí)現(xiàn)組件之間數(shù)據(jù)交互和通信操作示例

    Vue2.0實(shí)現(xiàn)組件之間數(shù)據(jù)交互和通信操作示例

    這篇文章主要介紹了Vue2.0實(shí)現(xiàn)組件之間數(shù)據(jù)交互和通信操作,結(jié)合實(shí)例形式分析了vue2.0組件之間通信的原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-05-05
  • 簡(jiǎn)述vue路由打開一個(gè)新的窗口的方法

    簡(jiǎn)述vue路由打開一個(gè)新的窗口的方法

    這篇文章主要介紹了vue路由打開一個(gè)新的窗口的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • Vue3警告:Failed to resolve component:XXX的詳細(xì)解決辦法

    Vue3警告:Failed to resolve component:XXX的詳細(xì)解決辦法

    最近在一個(gè)vue3項(xiàng)目中遇到了報(bào)錯(cuò),整理了些解決辦法,這篇文章主要給大家介紹了關(guān)于Vue3警告:Failed to resolve component:XXX的詳細(xì)解決辦法,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • vue 代碼高亮插件全面對(duì)比測(cè)評(píng)

    vue 代碼高亮插件全面對(duì)比測(cè)評(píng)

    這篇文章主要介紹了vue 代碼高亮插件全面對(duì)比測(cè)評(píng)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下
    2021-03-03
  • Vue項(xiàng)目?jī)?yōu)化打包之前端必備加分項(xiàng)

    Vue項(xiàng)目?jī)?yōu)化打包之前端必備加分項(xiàng)

    相信現(xiàn)在很多人都是用Vue做過了各種項(xiàng)目,但是項(xiàng)目代碼做完和上線并不代表這結(jié)束,還有上線以后的優(yōu)化也是很重要的一點(diǎn),這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目?jī)?yōu)化打包的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • vue3?emits事件使用示例詳解

    vue3?emits事件使用示例詳解

    這篇文章主要為大家介紹了vue3?emits事件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • vue實(shí)現(xiàn)頂部導(dǎo)航欄以及跳轉(zhuǎn)

    vue實(shí)現(xiàn)頂部導(dǎo)航欄以及跳轉(zhuǎn)

    這篇文章主要介紹了vue實(shí)現(xiàn)頂部導(dǎo)航欄以及跳轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Vue引入并使用Element組件庫的兩種方式小結(jié)

    Vue引入并使用Element組件庫的兩種方式小結(jié)

    本文主要介紹了Vue引入并使用Element組件庫的兩種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 利用vue組件自定義v-model實(shí)現(xiàn)一個(gè)Tab組件方法示例

    利用vue組件自定義v-model實(shí)現(xiàn)一個(gè)Tab組件方法示例

    這篇文章主要給大家介紹了關(guān)于利用vue組件自定義v-model實(shí)現(xiàn)一個(gè)Tab組件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12

最新評(píng)論

丰宁| 余姚市| 四川省| 潍坊市| 吉木乃县| 嘉黎县| 博野县| 南投市| 会昌县| 太和县| 林甸县| 卫辉市| 葫芦岛市| 洛阳市| 林甸县| 郧西县| 万荣县| 昌都县| 丰台区| 文昌市| 特克斯县| 塔河县| 张北县| 昌黎县| 长汀县| 寿宁县| 张家口市| 西和县| 沙田区| 澄城县| 应用必备| 龙陵县| 南充市| 绥滨县| 莆田市| 福建省| 平度市| 泰来县| 醴陵市| 巴塘县| 平安县|