Vue中Vuex的詳解與使用(簡潔易懂的入門小例項)
需要注意的是不是每一個專案都適合使用 Vuex,如果你的專案是中大型專案,那麼使用 Vuex 來管理錯綜複雜的狀態資料是很有幫助的,而為了後期的拓展性和可維護性,這裡不建議使用 CLI 生成的一份配置檔案來管理所有的狀態操作,我們可以把它拆分為以下目錄: ``` └── store ├── index.js # 我們組裝模組並匯出 store 的地方 ├── actions.js # 根級別的 action ├── mutations.js # 根級別的 mutation └── modules ├── moduleA.js # A模組 └── moduleB.js # B模組 ``` 與單個 store.js 檔案不同的是,我們按模組進行了劃分,每個模組中都可以包含自己 4 個核心功能。比如模組 A 中:
上方我們匯出 A 模組,並在 index.js 中引入:/* moduleA.js */ const moduleA = { state: { text: 'hello' }, mutations: { addText (state, txt) { // 這裡的 `state` 物件是模組的區域性狀態 state.text += txt } }, actions: { setText ({ commit }) { commit('addText', ' world') } }, getters: { getText (state) { return state.text + '!' } } } export default moduleA
這樣專案中狀態的模組劃分就更加清晰,對應模組的狀態我們只需要修改相應模組檔案即可。 那麼下面進入正題import Vue from 'vue' import Vuex from 'vuex' import moduleA from './modules/moduleA' import moduleB from './modules/moduleB' import { mutations } from './mutations' import actions from './actions' Vue.use(Vuex) export default new Vuex.Store({ state: { groups: [1] }, modules: { moduleA, // 引入 A 模組 moduleB, // 引入 B 模組 }, actions, // 根級別的 action mutations, // 根級別的 mutations // 根級別的 getters getters: { getGroups (state) { return state.groups } } })
眾所周知 Vuex 是什麼呢?是用來幹嘛的呢?
Vuex 是一個專為 Vue.js 應用程式開發的`狀態管理模式`。它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。
例如:你有幾個資料,幾個操作,在多個元件上都需要使用,如果每個元件都去呼叫都是寫,就會很麻煩,程式碼又臭又長。當然 如果沒有大量的操作和資料需要在多個元件內使用的話呢,其實也就可以不用這個 Vuex了。看個人吧!
這裡我就用自己對 Vuex 的理解來介紹這個東西怎麼去使用,我人也不聰明,整好久才整明白,話不多說,下面開始上程式碼。
1、首先為了專案格式便於維護和相對規範一點,我們先在 目錄下建立一個 store 資料夾,並且在下面建立一個 store.js 檔案:
2、簡單明瞭,先引入 Vue 和 Vuex 並且別忘了 Vue.use(Vuex);
當然你 Vuex 首先得跟 main.js 扯上點關係嘛。這裡的m_index.js === main.js 因為專案原因,暫時換了個名字,不過也無影響,好了我們繼續。
=》引入 store 檔案 =》 並且 Vue 例項上得將 掛載 store ,這下萬無一失。可以繼續了
然後我們就可以開始編寫我們的vuex業務程式碼了,那麼,我們的資料如何儲存?
3、現在開始 Vuex 的主宰部分 new Vuex.Store({})
在這張圖上可以清楚的看到 new Vuex.Store 裡面有一個 state:{ } 註釋也寫了,
這是你要設定的全域性訪問的 state 物件,也就是你需要 count 就丟個 count進去,需要 price 就丟個 price進去,
這裡我丟了個 count 和 ChangeShowCom 兩個不同的資料型別 作為一個對比。
4、如何在頁面中獲取 state 裡面的 資料呢?
通過 this.$store.state.count 可以拿到 state裡面的 count 也就是0,話不多說,看看吧5、getters =》getters 和 元件的 computed 類似,方便直接生成一些可以直接用的資料。當組裝的資料要在多個頁面使用時,就可以使用 getters 來做。
註釋也寫了,getters 可以實時監聽state值的變化(最新狀態)
我給getters裡面獲取count值的方法命名為 getCount 並且需要傳入 state
那麼如何獲取 通過 getters 獲取 承載變化的 count 的值呢?
this.$store.getters.getCount 具體效果在 第4 欄裡面有些,這裡就不作重複了。
6、那麼, 我們如果想改變 count 的值,應該怎麼做呢? 這時候就可以用到 mutations 。
要修改store中的值唯一的方法就是提交mutation來修改,我們現在Hello World.vue檔案中新增兩個按鈕,一個加1,一個減1;
這裡我們點選按鈕呼叫add(執行加的方法)和del(執行減法的方法),然後在裡面直接提交mutations中的方法修改值:
修改store.js檔案,新增mutations,在mutations中定義兩個函式,用來對count加1和減1,
這裡定義的兩個方法就是上面commit提交的兩個方法如下:
我們可以將引數傳遞給mutations中的函式進行計算 這裡是 num 。
現在我們看看效果 :
很好,count 數值都發生了改變,我點選了兩下,並且 是可以在 Vue Devtools 中的 Vuex 看到過程效果
payload :1 就是數值變化1 type 操作的方法是 addCount 也就是 mutations 根方法
ok!完美。
7、到了 Actions 了
Action 類似於 mutation,不同在於:
- Action 提交的是 mutation,而不是直接變更狀態。
- Action 可以包含任意非同步操作。
我們來看一下:
然後我們去修改Hello World.vue檔案:
這裡我們把commit提交mutations修改為使用dispatch來提交actions;我們點選頁面,效果是一樣的。
現在讓我們來看看效果,這裡我又點選了6下,很顯然,效果是一樣的。
注意,當實際寫專案的時候 裡面未必直接傳的是 數字1 可能是物件啊 或者字串啊。所以這個時候就要注意了,我舉個例子:
這裡寫個 input 輸入框 雙向繫結一個 something 記得在 data 裡面初始化一下,
然後,我們將something 傳入這個方法裡面 add(something)
這個時候,看著好像沒有什麼問題,那麼問題這時候就來了,我們先試試點加號會發生什麼?
我點選了三下加號,看到沒,直接在 0後面拼接了111 變成0111 這顯然不是我們想要的效果了,這是為什麼呢?
我們來列印一下 這個 1 的資料型別
原來如此,這個是字串型別,難怪不能直接加,那麼現在我們該怎麼辦呢?當然是 字串轉換成數字啦 parseInt()
當然是 字串轉換成數字啦 哈哈哈哈哈哈 parseInt(); 方法 然後繼續列印結果
好了,現在就是數字型別了,那麼我們繼續最後一步,並且看看效果吧
這裡我點選了三下,結果成功的變成了 6.
8、來看一下 Vuex 裡面的好東西,輔助函式 mapState、mapGetters、mapActions
如果我們不喜歡這種在頁面上使用“this.$stroe.state.count”和“this.$store.dispatch('funName')”這種很長的寫法,
那麼我們可以使用mapState、mapGetters、mapActions就不會這麼麻煩了;
並且我們配合 ... 拓展符 一起使用。