本文主要記錄 Vue.js 中的 Vuex,Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。 ...
1.1 理解 Vuex
1.1.1 Vuex
是什麼
- 概念:專門在
Vue
中實現集中式狀態(數據)管理的一個Vue
插件,對Vue
應用中多個組件的共用狀態進行集中式的管理(讀/寫),也是一種組件間通信的方式,且適用於任意組件間通信。 - Github地址
1.1.2 什麼時候使用 Vuex
- 多個組件依賴於同一狀態
- 來自不同組件的行為需要變更同一狀態
1.1.3 Vuex
工作原理圖
1.2 搭建 Vuex
環境與基本使用
1.2.1 環境 Vuex
搭建
-
創建文件:
src/store/index.js
//引入Vue核心庫 import Vue from 'vue' //引入Vuex import Vuex from 'vuex' //應用Vuex插件 Vue.use(Vuex) //準備actions對象——響應組件中用戶的動作 const actions = {} //準備mutations對象——修改state中的數據 const mutations = {} //準備state對象——保存具體的數據 const state = {} //創建並暴露store export default new Vuex.Store({ actions, mutations, state })
-
在
main.js
中創建vm
時傳入store
配置項...... //引入store import store from './store' ...... //創建vm new Vue({ el:'#app', render: h => h(App), store })
1.2.2 基本使用
-
初始化數據、配置
actions
、配置mutations
,操作文件store.js
//引入Vue核心庫 import Vue from 'vue' //引入Vuex import Vuex from 'vuex' //引用Vuex Vue.use(Vuex) const actions = { //響應組件中加的動作 jia(context,value){ // console.log('actions中的jia被調用了',miniStore,value) context.commit('JIA',value) }, } const mutations = { //執行加 JIA(state,value){ // console.log('mutations中的JIA被調用了',state,value) state.sum += value } } //初始化數據 const state = { sum:0 } //創建並暴露store export default new Vuex.Store({ actions, mutations, state, })
-
組件中讀取
Vuex
中的數據:$store.state.sum
-
組件中修改
Vuex
中的數據:$store.dispatch('action中的方法名',數據)
或$store.commit('mutations中的方法名',數據)
備註:若沒有網路請求或其他業務邏輯,組件中也可以越過
actions
,即不寫dispatch
,直接編寫commit
1.3 Vuex
核心概念和API
1.3.1 state
-
Vuex
管理的狀態對象 -
它應該是唯一的
-
示例代碼:
const state = { sum:0 }
1.3.2 actions
-
值為一個對象,包含多個響應用戶動作的回調函數
-
通過
commit()
來觸發mutation
中函數的調用,間接更新state
-
如何觸發
actions
中的回調?在組件中使用:
$store.dispatch('對應的action回調名')
觸發 -
可以包含非同步代碼(定時器,ajax等等)
-
示例代碼:
const actions = { //響應組件中加的動作 jia(context,value){ // console.log('actions中的jia被調用了',miniStore,value) context.commit('JIA',value) }, }
1.3.3 mutations
-
值是一個對象,包含多個直接更新
state
的方法 -
誰能調用
mutations
中的方法?如何調用?在
action
中使用:commit('對應的mutations方法名')
觸發 -
mutations
中方法的特點:不能寫非同步代碼、只能單純的操作state
-
示例代碼:
const mutations = { //執行加 JIA(state,value){ // console.log('mutations中的JIA被調用了',state,value) state.sum += value } }
1.3.4 getters
-
概念:當
state
中的數據需要經過加工後再使用時,可以使用getters
加工。 -
在
store.js
中追加getters
配置// 準備 getters —— 用於對 state 中的數據進行加工 const getters = { bigSum(state){ return state.sum * 10 } } // 創建並暴露store export default new Vuex.Store({ ...... getters })
-
組件中讀取數據:
$store.getters.bigSum
1.4 四個 map
方法的使用
1.4.1 mapState
方法
mapState
方法:用於幫助我們映射 state
中的數據為計算屬性
computed: {
//藉助mapState生成計算屬性:sum、school、subject(對象寫法)
...mapState({sum:'sum',school:'school',subject:'subject'}),
//藉助mapState生成計算屬性:sum、school、subject(數組寫法)
...mapState(['sum','school','subject']),
},
1.4.2 mapGetters
方法
mapGetters
方法:用於幫助我們映射 getters
中的數據為計算屬性
computed: {
//藉助mapGetters生成計算屬性:bigSum(對象寫法)
...mapGetters({bigSum:'bigSum'}),
//藉助mapGetters生成計算屬性:bigSum(數組寫法)
...mapGetters(['bigSum'])
},
1.4.3 mapActions
方法
mapActions
方法:用於幫助我們生成與 actions
對話的方法,即:包含 $store.dispatch(xxx)
的函數
methods:{
//靠mapActions生成:incrementOdd、incrementWait(對象形式)
...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
//靠mapActions生成:incrementOdd、incrementWait(數組形式)
...mapActions(['jiaOdd','jiaWait'])
}
1.4.4 mapMutations
方法
mapMutations
方法:用於幫助我們生成與 mutations
對話的方法,即:包含 $store.commit(xxx)
的函數
methods:{
//靠mapActions生成:increment、decrement(對象形式)
...mapMutations({increment:'JIA',decrement:'JIAN'}),
//靠mapMutations生成:JIA、JIAN(對象形式)
...mapMutations(['JIA','JIAN']),
}
備註:
mapActions
與mapMutations
使用時,若需要傳遞參數需要:在模板中綁定事件時傳遞好參數,否則參數是事件對象。
1.5 模塊化+命名空間
- 業務場景中需要包含多個
module
,一個module
是一個store
的配置對象,與一個組件(包含有共用數據)對應 - 目的:讓代碼更好維護,讓多種數據分類更加明確
進行模塊化:
-
修改
store.js
const countAbout = { namespaced:true,//開啟命名空間 state: {x: 1}, mutations: { ... }, actions: { ... }, getters: { bigSum(state){ return state.sum * 10 } } } const personAbout = { namespaced:true,//開啟命名空間 state:{ ... }, mutations: { ... }, actions: { ... } } const store = new Vuex.Store({ modules: { countAbout, personAbout } })
-
開啟命名空間後,組件中讀取
state
數據//方式一:自己直接讀取 this.$store.state.personAbout.list //方式二:藉助mapState讀取: ...mapState('countAbout',['sum','school','subject']),
-
開啟命名空間後,組件中讀取
getters
數據//方式一:自己直接讀取 this.$store.getters['personAbout/firstPersonName'] //方式二:藉助mapGetters讀取: ...mapGetters('countAbout',['bigSum'])
-
開啟命名空間後,組件中調用
dispatch
//方式一:自己直接dispatch this.$store.dispatch('personAbout/addPersonWang',person) //方式二:藉助mapActions: ...mapActions('countAbout',{incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
-
開啟命名空間後,組件中調用
commit
//方式一:自己直接commit this.$store.commit('personAbout/ADD_PERSON',person) //方式二:藉助mapMutations: ...mapMutations('countAbout',{increment:'JIA',decrement:'JIAN'}),