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.jsconst 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'}),
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/526902.html
標籤:其他
下一篇:首頁登錄注冊模態框搭建
