今天試了一下Vuex,感受跟Redux的實現思想相似。再此,簡單地總結一下。javascript
在Vue中,多組件的開發給咱們帶來了不少的方便,但同時當項目規模變大的時候,多個組件間的數據通訊和狀態管理就顯得難以維護。而Vuex就此應運而生。將狀態管理單獨拎出來,應用統一的方式進行處理,在後期維護的過程當中數據的修改和維護就變得簡單而清晰了。Vuex採用和Redux相似的單向數據流的方式來管理數據。用戶界面負責觸發動做(Action)進而改變對應狀態(State),從而反映到視圖(View)上。以下圖所示:html
安裝:vue
npm install --save vuex
引入:java
完整的應用Vuex開發的應用結構應該是這樣的:web
下面針對比較核心的部分進行說明。vuex
State負責存儲整個應用的狀態數據,通常須要在使用的時候在跟節點注入store
對象,後期就可使用this.$store.state
直接獲取狀態npm
//store爲實例化生成的
import store from './store'
new Vue({
el: '#app',
store,
render: h => h(App)
})
這個store能夠理解爲一個容器,包含着應用中的state等。實例化生成store的過程是:bash
const mutations = {...};
const actions = {...};
const state = {...};
Vuex.Store({
state,
actions,
mutation
});
後續在組件中使用的過程當中,若是想要獲取對應的狀態你就能夠直接使用this.$store.state
獲取,固然,也能夠利用vuex
提供的mapState
輔助函數將state
映射到計算屬性中去,如app
這樣直接就能夠在組件中直接使用了。異步
Mutations
的中文意思是「變化」,利用它能夠更改狀態,本質就是用來處理數據的函數,其接收惟一參數值state
。store.commit(mutationName)
是用來觸發一個mutation
的方法。須要記住的是,定義的mutation
必須是同步函數,不然devtool中的數據將可能出現問題,使狀態改變變得難以跟蹤。
在組件中觸發:
或者使用輔助函數mapMutations
直接將觸發函數映射到methods
上,這樣就能在元素事件綁定上直接使用了。如:
import {mapMutations} from 'vuex'
//我是一個組件
export default {
methods: mapMutations([
'mutationName'
])
}
Actions
也能夠用於改變狀態,不過是經過觸發mutation
實現的,重要的是能夠包含異步操做。其輔助函數是mapActions
與mapMutations
相似,也是綁定在組件的methods
上的。若是選擇直接觸發的話,使用this.$store.dispatch(actionName)
方法。
在組件中使用
import {mapActions} from 'vuex'
//我是一個組件
export default {
methods: mapActions([
'actionName',
])
}
有些狀態須要作二次處理,就可使用getters
。經過this.$store.getters.valueName
對派生出來的狀態進行訪問。或者直接使用輔助函數mapGetters
將其映射到本地計算屬性中去。
在組件中使用
import {mapGetters} from 'vuex'
//我是一個組件
export default {
computed: mapGetters([
'strLength'
])
}
插件就是一個鉤子函數,在初始化store
的時候引入便可。比較經常使用的是內置的logger插件,用於做爲調試使用。
最後,還有一些高級用法,如嚴格模式,測試等可能使用頻率不會特別高。有須要的時候查官方文檔就能夠了。總的來講,Vuex仍是相對比較簡單的,特別是若是以前有學過Flux,Redux之類的話,上手起來更加容易。