import Vue, { reactive, computed } from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
state: {},
getters: {},
mutations: {},
actions: {}
})
function useStoreMapper(mapFn, mapper, isComputed) {
const storeStateFns = mapFn(...mapper)
const storeState = {}
Object.keys(storeStateFns).forEach(fnKey => {
const fn = storeStateFns[fnKey].bind({ $store: store })
storeState[fnKey] = isComputed ? computed(fn) : fn
})
return reactive(storeState)
}
export function useStoreState(...mapper) {
return useStoreMapper(Vuex.mapState, mapper, true)
}
export function useStoreGetters(...mapper) {
return useStoreMapper(Vuex.mapGetters, mapper, true)
}
export function useStoreMutations(...mapper) {
return useStoreMapper(Vuex.mapMutations, mapper, false)
}
export function useStoreActions(...mapper) {
return useStoreMapper(Vuex.mapActions, mapper, false)
}
export default store