詳解Vuex的屬性
Vuex是專為Vue.js應用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應用的所有組件的狀態(tài),并以相應的規(guī)則保證狀態(tài)以一種可預測的方式發(fā)生變化。
簡單來說:Vuex是Vue框架中狀態(tài)管理

圖中綠色虛線包裹起來的部分就是Vue的核心,state中保存的就是公共狀態(tài),改變state的唯一方式就是通過mutations進行更改
狀態(tài)管理模式
把組件的共享狀態(tài)抽取出來,以一個全局單例模式管理。在這種模式下,組件數構成了一個巨大的視圖,不管在樹的哪個位置,任何組件都能獲取狀態(tài)或者觸發(fā)行為,這就是狀態(tài)管理模式。
應用場景有:單頁應用中,組件之間的數據狀態(tài)
應用實例:
- 購物車功能
- 下單頁面選擇優(yōu)惠券按鈕,點擊進入優(yōu)惠券頁面,選擇后返回到下單頁,數據會綁定回來,顯示已選擇的優(yōu)惠券
- 登錄狀態(tài)等
Vuex的屬性
state
Vuex就是一個倉庫,倉庫里面放了很多對象,其中state就是數據源存放地,對應一般Vue對象里面的datastate里面存放的數據是響應式的,Vue組件從store中讀取數據,若是store中的數據發(fā)生改變,依賴這個數據的組件也會發(fā)生更新- 通過
mapState把全局的state和getters映射到當前組件的computed計算屬性中
getters
getters可以對state進行計算操作,它就是store的計算屬性- 雖然在組件內也可以做計算屬性,但是
getters可以在多組件之間復用 - 如果一個狀態(tài)只在一個組件內使用,可以不用
getters
Mutations
每個mutations都有一個字符串的事件類型(type)和一個回調函數(handler),這個回調函數就是實際進行狀態(tài)修改的地方,并且它會接收state作為第一個參數:
const store = new Vuex.Store({
state:{
count:1
},
mutations:{
increment(state){
//變更狀態(tài)
state.count++
}
}
})不能直接調用一個mutation handler。這個選項更像是事件注冊,當觸發(fā)一個類型為increment的mutations時,調用此函數。要喚醒一個mutation handler,需要調用相應的type調用store.commit方法
store.commit('increment')提交載荷(payload)
可以向store.commit傳入額外的參數,即mutation的載荷(payload)
state:{
count:0
},
mutations:{
increment(state,n){
state.count += n
}
}
//組件
store.commit('increment',10)在大多數情況下,載荷應該是一個對象,這安樣可以包含多個字段并且記錄的mutation會更易讀
state:{
count:0
},
mutations:{
increment(state,payload){
state.count += payload
}
}
//組件
store.commit('increment',{
amount:10
})Mutation需遵守Vue的響應規(guī)則
既然Vuex的store中的狀態(tài)時響應式的,那么當我們變更狀態(tài)時,監(jiān)聽狀態(tài)的Vue組件也會自動更新。這也意味著Vuex中的mutation需要與使用Vue一樣遵守一些注意事項:
最好提前在store中初始化好所有所需屬性
當需要在對象上添加新屬性時,應該
mutation必須是同步函數
使用Vue.set(obj,'newProp,123)
以新對象替換老對象。例如,利用對象展開運算符
state.obj = {...state.obj,newProp:123}actions
action類似于mutation,不同在于:
action通過store.dispatch方法觸發(fā)
store.dispatch('increment')在action內部執(zhí)行異步操作
actions:{
incrementAsync({commit}){
setTimeout(() => {
commit('increment')
},1000)
}
}action同樣支持載荷方式和對象方式進行分發(fā)
//以載荷形式分發(fā)
store.dispatch('incrementAsync',{
amount:10
})
//以對象形式分發(fā)
store.dispatch({
type:'incrementAsync',
amount:10
})action提交的是mutation,而不是直接變更狀態(tài)action可以包含任意異步操作
module
module可以讓每個模塊擁有自己的state、mutations、action、getters使得結構非常清晰,方便管理
const moduleA = {
state: { ... },
mutations: { ... },
actions: { ... },
getters: { ... }
}
const moduleB = {
state: { ... },
mutations: { ... },
actions: { ... }
}
const store = new Vuex.Store({
modules: {
a: moduleA,
b: moduleB
})使用Vuex的好處
- 多層嵌套的組件,兄弟組件間的狀態(tài)會更好管理維護
- 緩存一些當前要使用的請求遠程或本地的數據集(刷新后會自動銷毀)
- 有了第二條就可以減少向服務器的請求,節(jié)省資源
- 對于開發(fā)者來說,如果項目足夠復雜,團隊規(guī)模大,數據集中處理更利于程序的穩(wěn)定和維護
參考文獻:
到此這篇關于Vuex的屬性的文章就介紹到這了,更多相關Vuex的屬性內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue3.x中useRouter()執(zhí)行后返回值是undefined問題解決
這篇文章主要給大家介紹了關于vue3.x中useRouter()執(zhí)行后返回值是undefined問題的解決方法,文中通過代碼示例介紹的非常詳細,對大家學習或者使用vue3.x具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09

