Vue Vuex
1.1 了解 Vuex
Vuex
1.1.1 Vuex
是什麼
Vuex
- 概念:專門在
中實作集中式狀态(資料)管理的一個 Vue
插件,對 Vue
應用中多個元件的共享狀态進行集中式的管理(讀/寫),也是一種元件間通信的方式,且适用于任意元件間通信。Vue
- Github位址
1.1.2 什麼時候使用 Vuex
Vuex
- 多個元件依賴于同一狀态
- 來自不同元件的行為需要變更同一狀态
1.1.3 Vuex
工作原理圖
Vuex
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAnYldHL0FWby9mZvwFN4ETMfdHLkVGepZ2XtxSZ6l2clJ3LcV2Zh1Wa9M3clN2byBXLzN3btgHL9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iM1ITO0UWMhRDO2ADNjNjNzYzXwEzNzEjMzAzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
1.2 搭建 Vuex
環境與基本使用
Vuex
1.2.1 環境 Vuex
搭建
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
Vuex
1.3.1 state
state
-
管理的狀态對象Vuex
- 它應該是唯一的
- 示例代碼:
const state = {
sum:0
}
1.3.2 actions
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
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
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
方法的使用
map
1.4.1 mapState
方法
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
mapGetters
方法:用于幫助我們映射
getters
中的資料為計算屬性
computed: {
//借助mapGetters生成計算屬性:bigSum(對象寫法)
...mapGetters({bigSum:'bigSum'}),
//借助mapGetters生成計算屬性:bigSum(數組寫法)
...mapGetters(['bigSum'])
},
1.4.3 mapActions
方法
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
methods:{
//靠mapActions生成:increment、decrement(對象形式)
...mapMutations({increment:'JIA',decrement:'JIAN'}),
//靠mapMutations生成:JIA、JIAN(對象形式)
...mapMutations(['JIA','JIAN']),
}
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'}),