Vuex 是一個專為 Vue.js 應用程序開發(fā)的狀態(tài)管理模式栗弟。它采用集中式存儲管理應用的所有組件的狀態(tài),并以相應的規(guī)則保證狀態(tài)以一種可預測的方式發(fā)生變化横腿。
1.State --- 驅(qū)動應用的數(shù)據(jù)源(存儲著需要管理的組件的狀態(tài))
(1)組件內(nèi)部通過 this.$store.state.loginState 拿到登陸狀態(tài)
(2)組件內(nèi)部通過 計算屬性 結(jié)合 mapState 輔助函數(shù)拿到組件狀態(tài)
在需要使用狀態(tài)的組件內(nèi)部通過mapState輔助函數(shù)
獲裙⒑浮:
2.Getter --- 可以看作是state的計算屬性罗侯,類似于組件中的data與computed
tip:getters可以不用,在組件內(nèi)部寫一個關(guān)于state的計算屬性
(1)組件內(nèi)部通過 this.$store.getters.len 拿到getter對應的狀態(tài)
(2)組件內(nèi)部通過 計算屬性 結(jié)合 mapGetters 輔助函數(shù)拿到getter對應的狀態(tài)
通過mapGetters輔助函數(shù)
獲热宜:
此時可以this.len使用len的值措左,在template中{{ len }}使用
3.Mutation --- 更改 Vuex 的store中的狀態(tài)的唯一方法是提交mutation(同步函數(shù))
Vuex 中的 mutation 非常類似于事件:每個 mutation 都有一個字符串的 事件類型 (type) 和 一個 回調(diào)函數(shù) (handler)避除。這個回調(diào)函數(shù)就是我們實際進行狀態(tài)更改的地方,并且它會接受 state 作為第一個參數(shù)
用常量代替mutation的函數(shù)名
另一種引入方式:
引入全部的常量的這個方式状飞,使用的時候:
types.CHANGE_LOGIN_STATE
用不用常量取決于你——在需要多人協(xié)作的大型項目中自晰,這會很有幫助。但如果你不喜歡酬荞,你完全可以不這樣做
4.Action
Action 類似于 mutation搓劫,不同在于:
Action 提交的是 mutation枪向,而不是直接變更狀態(tài)。
Action 可以包含任意異步操作秘蛔。
4.1異步操作在組件內(nèi)部
store.js中添加kindlist的狀態(tài)以及添加修改的mutation
總結(jié):狀態(tài)管理器中添加kindlist的狀態(tài)深员,添加mutation來改變kindlist的狀態(tài),在組件內(nèi)部將請求到的數(shù)據(jù)提交到mutation倦畅,從而儲存在kindlist中,然后通過mapState輔助函數(shù)拿到更新后的kindlist叠赐,最后渲染到頁面
4.2異步操作交給狀態(tài)管理器去處理
(1)在actions中定義一個函數(shù)屡江,將之前在組件中的異步操作放到函數(shù)中:
(2)在組件中觸發(fā)actions
5.module模塊組
隨著項目的復雜性增加,我們共享的狀態(tài)越來越多惩嘉,這時候我們就需要把我們狀態(tài)的各種操作進行一個分組,分組后再進行按組編寫宏怔。那今天我們就學習一下module:狀態(tài)管理器的模塊組操作。
5.1聲明模塊組:
在vuex/store.js中聲明模塊組,我們還是用我們的const常量的方法聲明模塊組斜脂。代碼如下:
const moduleA={
state,mutations,getters,actions
}
聲明好后,我們需要修改原來 Vuex.Stroe里的值:
export default new Vuex.Store({
modules:{a:moduleA}
})
5.2在組件中使用:
<span>{{ $store.state.a.loginState}}</span>
個人理解至此實現(xiàn)了:
vue components
通過dispatch
觸發(fā)actions
帚戳,actions
提交commit
到mutations
,mutations
更改state
的狀態(tài)偏友,state
中的狀態(tài)通過組件vue components
渲染到頁面!
tips:為什么要使用狀態(tài)管理器 --- 方便各個組件間的傳值!