Vue3+webpack項目的vuex封裝

Vuex 是一個專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式 + 庫。

它采用集中式存儲管理應(yīng)用的所有組件的狀態(tài),并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測的方式發(fā)生變化。

簡單解釋就是它是用來放項目所有組件都能共享的數(shù)據(jù)用的私杜。

首先安裝vuex:

npm i vuex -s

封裝vuex的目錄結(jié)構(gòu)如下圖:

圖1

【./src/store】:用來存放封裝 vuex 相關(guān)文件的文件夾;

【./src/store/index.js】:封裝 vuex 的主體文件娃殖,創(chuàng)建全局store,存放全局使用共享的數(shù)據(jù)萧锉。

代碼:

import { createStore } from 'vuex'

import state from './components/state'

import actions from './components/actions'

import getters from './components/getters'

import mutations from './components/mutations'

import modA from './storeModules/modA.js'

// 全局store,存放全局使用共享的數(shù)據(jù)

// 注意:全局模塊中不需要開啟命名空間

export default createStore({

? state,? ? ? ? // 設(shè)置的初始屬性值

? getters,? ? ? // 實時監(jiān)聽state值的變化(最新狀態(tài))

? mutations,? ? // 定義mutations珊随,用于修改狀態(tài)(同步)

? actions,? ? ? // 定義actions,用于修改狀態(tài)(異步)

? // 局部模塊

? modules: {

? ? modA

? }

})

注意:

1.全局模塊中不需要開啟命名空間柿隙。

2.state 是設(shè)置的初始屬性值,項目中的狀態(tài)變化也會更新 state鲫凶。

3.getters 實時監(jiān)聽state值的變化(最新狀態(tài))禀崖。

4.mutations 用于修改狀態(tài)(同步)。

5.actions 用于修改狀態(tài)(異步)螟炫。

6.modules 用來引入不同模塊數(shù)據(jù)波附。


【./src/store/components/state.js】:

代碼:

// .vue文件可以通過 store 獲取初始狀態(tài)數(shù)據(jù)

const state = {

? ? names: '月影WEB',

? ? ages:18

}

// vue2

// ----this.$store.state.names

// vue3

// ----import { useStore } from 'vuex'

// ----const store = useStore()

// ----store.state.names

export default state;

注意:

1.【.vue】文件可以通過 store 獲取初始狀態(tài)數(shù)據(jù)。

2.【vue2】可以通過 this.$store.state.names 或者 this.$store.state.ages 來獲取 state 狀態(tài)中的數(shù)據(jù)昼钻。

3.【vue3】獲取 state 中的數(shù)據(jù)方式如下:

import { useStore } from 'vuex'

const store = useStore()

console.log(store.state.names)

console.log(store.state.ages)


【./src/store/components/getters.js】:

代碼:

// 實時監(jiān)聽state值的變化(最新狀態(tài))掸屡,

// 只是用來方便監(jiān)聽最新的state的變化

const getters = {

? ? isShow(state) {? // 承載變化的 names 的值

? ? ? ? return state.names

? ? },

? ? getChangeAges(state){? //承載變化的 ages 的值

? ? ? ? return state.ages

? ? }

}

// vue2

// ----this.$store.getters.getChangeAges

// vue3

// ----import { useStore } from 'vuex'

// ----const store = useStore()

// ----store.getters.getChangeAges

export default getters;

注意:

1.實時監(jiān)聽 state 值的變化(最新狀態(tài))。

2.【vue2】可以通過 this.$store.getters.isShow 或者 this.$store.state.getChangeAges 來實時監(jiān)聽 state 狀態(tài)中的數(shù)據(jù)變化然评。

3.【vue3】實時監(jiān)聽 state 中的數(shù)據(jù)方式如下:

import { useStore } from 'vuex'

const store = useStore()

console.log(store.getters.isShow)

console.log(store.getters.getChangeAges)


【./src/store/components/mutations.js】:

代碼:

// 定義mutations仅财,用于修改狀態(tài)(同步)

// 自定義改變state初始值的方法,這里面的參數(shù)除了state之外還可以再傳額外的參數(shù)(變量或?qū)ο?;

const mutations = {

? changesNames(state) {? // 自定義改變state初始值的方法碗淌,這里面的參數(shù)除了state之外還可以再傳額外的參數(shù)(變量或?qū)ο?;

? ? state.names = '月影WEB-改變';

? },

? newAges(state,sum){ // 同上盏求,這里面的參數(shù)除了state之外還傳了需要增加的值sum

? ? state.ages += sum;

? }

}

// vue2

// ----this.$store.commit('changesNames')

// vue3

// ----import { useStore } from 'vuex'

// ----const store = useStore()

// ----store.commit('changesNames')

export default mutations;

注意:

1.用于修改狀態(tài)(同步)。

2.【vue2】可以通過 this.$store.commit('changesNames') 或者this.$store.commit('newAges')? 來修改 state 狀態(tài)中 names 和 ages 的數(shù)據(jù)亿眠。

3.【vue3】修改 state 中的數(shù)據(jù)方式如下:

import { useStore } from 'vuex'

const store = useStore()

store.commit('changesNames')

store.commit('newAges')


【./src/store/components/actions.js】:

代碼:

// 定義actions碎罚,用于修改狀態(tài)(異步)

const actions = {

? ? changesNames(context) {? // 自定義觸發(fā)mutations里函數(shù)的方法,context與store 實例具有相同方法和屬性

? ? ? context.commit('changesNames');

? ? },

? ? getNewAges(context,num){? // 同上注釋纳像,num為要變化的形參

? ? ? ? context.commit('newAges',num)

? ? }

}

// vue2

// ----this.$store.dispatch('getNewNum',1)

// vue3

// ----import { useStore } from 'vuex'

// ----const store = useStore()

// ----store.dispatch('getNewNum',1)

export default actions;

注意:

1.用于修改狀態(tài)(異步)

2.【vue2】可以通過 this.$store.dispatch('changesNames') 或者this.$store.dispatch('getNewAges')? 來調(diào)用 actions.js 中對應(yīng)的方法進而修改 state 狀態(tài)中的數(shù)據(jù)荆烈。

3.【vue3】調(diào)用 actions.js 中對應(yīng)的方法進而修改 state 中的數(shù)據(jù)方式如下:

import { useStore } from 'vuex'

const store = useStore()

store.dispatch('changesNames')

store.dispatch('getNewNum',1)


【./src/store/components/storeModules】:此文件夾下放各局部模塊的 state 等等。

代碼:

// ceshi 模塊的內(nèi)容

const state = {

? ? // ceshi 模塊的數(shù)據(jù)

};

const mutations = {

? ? // ceshi 模塊的 mutations

};

const actions = {

? ? // ceshi 模塊的actions

};

export default {

? ? namespaced: true, // 開啟命名空間

? ? state,

? ? actions,

? ? mutations

}

注意:局部模塊多一個開啟命名空間竟趾。

以上代碼就已經(jīng)對 Vuex 進行了簡單的封裝了憔购。


接下去就如何使用 Vuex 封裝的代碼了?

1.在【./src/index.js 】文件中引用封裝的 Vuex 潭兽。

如下圖:

圖2

2.在【./src/App.vue】文件中測試 Vuex 封裝的效果倦始。

如下圖:

圖3

頁面效果圖如下:

圖4

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市山卦,隨后出現(xiàn)的幾起案子鞋邑,更是在濱河造成了極大的恐慌诵次,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枚碗,死亡現(xiàn)場離奇詭異逾一,居然都是意外死亡,警方通過查閱死者的電腦和手機肮雨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門遵堵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怨规,你說我怎么就攤上這事陌宿。” “怎么了波丰?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵壳坪,是天一觀的道長。 經(jīng)常有香客問我掰烟,道長爽蝴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任纫骑,我火速辦了婚禮蝎亚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘先馆。我一直安慰自己发框,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布磨隘。 她就那樣靜靜地躺著缤底,像睡著了一般。 火紅的嫁衣襯著肌膚如雪番捂。 梳的紋絲不亂的頭發(fā)上个唧,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音设预,去河邊找鬼徙歼。 笑死,一個胖子當(dāng)著我的面吹牛鳖枕,可吹牛的內(nèi)容都是我干的魄梯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼宾符,長吁一口氣:“原來是場噩夢啊……” “哼酿秸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起魏烫,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤辣苏,失蹤者是張志新(化名)和其女友劉穎肝箱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稀蟋,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡煌张,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了退客。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骏融。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖萌狂,靈堂內(nèi)的尸體忽然破棺而出档玻,到底是詐尸還是另有隱情,我是刑警寧澤粥脚,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布窃肠,位于F島的核電站,受9級特大地震影響刷允,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碧囊,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一树灶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糯而,春花似錦天通、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瓜贾,卻和暖如春诺祸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祭芦。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工筷笨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人龟劲。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓胃夏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親昌跌。 傳聞我的和親對象是個殘疾皇子仰禀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容