在Vue開發中,我們經常會遇到需要從store中獲取state的情況,如果需要派生出一些計算屬性,就需要使用getter。Getter是一個函數,它可以從state中派生出一些狀態。Vuex中有一個特性,就是可以將store分割成子模塊,每個子模塊都有自己的state、mutation、action和getter。
在子模塊中,我們同樣可以定義getter,提供子模塊內部狀態的計算。如果在根級別上使用getter,我們可以通過類似的方式訪問它們:
store.getters['exampleGetter']
store.getters['myModule/exampleGetter']
這里的第一個 exampleGetter 是根級別的getter,第二個 exampleGetter 是 myModule 模塊中的getter。
在 myModule 中定義一個 getter:
const store = new Vuex.Store({
state:{
count: 0
},
getters: {
getCount: state =>{
return state.count
},
exampleGetter: (state, getters) =>(id) =>{
return getters.getCount + id
}
}
})
我們定義了兩個getter,getCount 是子模塊內部使用的,exampleGetter 是在引用外部使用的。注意到 exampleGetter 返回一個函數,這意味著我們可以在Vue組件中以參數的形式調用它。例如:
computed: {
result () {
return this.$store.getters['exampleGetter'](1)
}
}
這里的調用方式和普通的getter有所不同,這是因為 exampleGetter 是屬于 myModule 的。如果在根模塊內調用:this.$store.getters.exampleGetter
就行了。
Getter的另一個特性是可以在其他getter內部使用。這在復雜的應用場景中非常有用。例如,我們可以創建一個 getter,它依賴于另一個 getter:
getters: {
exampleGetterOne: state =>state.a,
exampleGetterTwo: (state, getters) =>getters.exampleGetterOne + state.b
}
在 exampleGetterTwo 內部調用了 exampleGetterOne,并使用其結果來計算返回值。
最后需要注意的是,getter是一個純函數,它只依賴state和其他getter,不會對state進行修改。因此,它沒有對 Vuex 的全局狀態產生副作用。