在 Vue.js 中,Vuex 是官方推荐的状态管理库。Vuex 提供了几个 辅助函数 来简化你在组件中读取和操作 state
、getters
、mutations
和 actions
的方式,特别适用于模块化结构。辅助函数的使用能让代码更简洁、清晰。
🔧 一、常用 Vuex 辅助函数汇总
辅助函数 | 用途 | 适用于 |
---|---|---|
mapState |
映射 state 到计算属性 |
组件 |
mapGetters |
映射 getters 到计算属性 |
组件 |
mapMutations |
映射 mutations 到方法 |
组件 |
mapActions |
映射 actions 到方法 |
组件 |
createNamespacedHelpers |
命名空间模块辅助函数生成器 | 组件(模块化) |
📦 二、使用方式示例(不带模块命名空间)
假设 Vuex 的状态如下:
// store.js
export default new Vuex.Store({
state: {
count: 0
},
getters: {
doubleCount: state => state.count * 2
},
mutations: {
increment(state) {
state.count++
}
},
actions: {
asyncIncrement({ commit }) {
setTimeout(() => {
commit('increment')
}, 1000)
}
}
})
1. mapState
示例
import { mapState } from 'vuex'
export default {
computed: {
...mapState(['count'])
// 或指定映射名
// ...mapState({ myCount: 'count' })
}
}
2. mapGetters
示例
import { mapGetters } from 'vuex'
export default {
computed: {
...mapGetters(['doubleCount'])
// 或指定映射名
// ...mapGetters({ myDouble: 'doubleCount' })
}
}
3. mapMutations
示例
import { mapMutations } from 'vuex'
export default {
methods: {
...mapMutations(['increment'])
}
}
<button @click="increment">+1</button>
4. mapActions
示例
import { mapActions } from 'vuex'
export default {
methods: {
...mapActions(['asyncIncrement'])
}
}
📁 三、命名空间模块中的辅助函数用法
假设你的 store 中使用了模块:
// store/modules/counter.js
export default {
namespaced: true,
state: () => ({ count: 0 }),
getters: {
double(state) {
return state.count * 2
}
},
mutations: {
increment(state) {
state.count++
}
},
actions: {
asyncIncrement({ commit }) {
setTimeout(() => {
commit('increment')
}, 500)
}
}
}
1. 使用 createNamespacedHelpers
import { createNamespacedHelpers } from 'vuex'
const { mapState, mapGetters, mapActions, mapMutations } = createNamespacedHelpers('counter')
export default {
computed: {
...mapState(['count']),
...mapGetters(['double'])
},
methods: {
...mapMutations(['increment']),
...mapActions(['asyncIncrement'])
}
}
🧠 四、使用注意事项
-
所有辅助函数都必须在
computed
或methods
中使用(取决于它是 getter 还是函数) -
使用模块时要加
namespaced: true
才能使用createNamespacedHelpers
-
如果不使用
createNamespacedHelpers
,也可以手动指定路径:如mapState('counter', ['count'])
✅ 五、最终建议
你要访问的内容 | 建议使用的辅助函数 |
---|---|
state (状态) |
mapState |
getters (派生状态) |
mapGetters |
mutations (同步修改) |
mapMutations |
actions (异步操作) |
mapActions |
使用命名空间模块 | createNamespacedHelpers |
如你正在使用 Vue 3 + Vuex 4 ,这些写法仍然适用。但如果你升级到了 Pinia(Vuex 5 之后的推荐替代),辅助函数将不同。