modules
选项以注册该模块。以下是一个简单的Vuex模块示例:
// module.js
const module = {
state: {
count: 0
},
mutations: {
increment(state) {
state.count++
}
},
actions: {
incrementAsync({ commit }) {
setTimeout(() => {
commit('increment')
}, 1000)
}
},
getters: {
doubleCount(state) {
return state.count * 2
}
}
}
export default module
modules
选项中:import Vue from 'vue'
import Vuex from 'vuex'
import module from './module'
Vue.use(Vuex)
const store = new Vuex.Store({
modules: {
module
}
})
export default store
modules/user.js
const state = {
userInfo: {
name: 'zs',
age: 18
},
myMsg: '我的数据'
}
const mutations = {
updateMsg (state, msg) {
state.myMsg = msg
}
}
const actions = {}
const getters = {}
export default {
namespaced: true,
state,
mutations,
actions,
getters
}
$store.state.user.userInfo.name
...mapState('user', ['userInfo']),
...mapState('setting', ['theme', 'desc']),
mapGetters
函数用于从模块中映射 getters 到局部计算属性。它接收一个字符串数组和/或对象。使用模块中 getters 中的数据:
$store.getters['模块名/xxx ']
mapGetters([ 'xxx' ])
mapGetters('模块名', ['xxx'])
- 需要开启命名空间:namespaced:true以下是一个使用 mapGetters
的示例:
<template>
<div>
<p>count: {{doubleCount}}</p>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
export default {
computed: {
// 从名为 `module` 的 store 模块中映射 `doubleCount` getter
...mapGetters('module', ['doubleCount'])
}
}
</script>
$store.commit('模块名/xxx ', 额外参数)
mapMutations
映射
mapMutations([ 'xxx' ])
mapMutations('模块名', ['xxx'])
- 需要开启命名空间:namespaced:true<button @click="setUser({ name: 'xiaoli', age: 80 })">更新个人信息</button>
<button @click="setTheme('skyblue')">更新主题</button>
methods:{
// 分模块的映射
...mapMutations('setting', ['setTheme']),
...mapMutations('user', ['setUser']),
}
默认模块中的 mutation 和 actions 会被挂载到全局,需要开启命名空间,才会挂载到子模块。
mapActions 函数用于从模块中映射 actions 到局部方法。
字符串数组中的每个项都是 action 名称,对象中的每个键是局部方法名称,值是 action 名称。
需求:实现一秒后更新信息
modules/user.js
const actions = {
setUserSecond (context, newUserInfo) {
// 将异步方法在action中进行封装
setTimeout(() => {
// 调用mutation context上下文,默认提交的就是自己模块的action和mutation
context.commit('setUser', newUserInfo)
}, 1000)
}
}
<button @click="updateUser2">一秒后更新信息</button>
methods:{
updateUser2 () {
// 调用action dispatch
this.$store.dispatch('user/setUserSecond', {
name: 'xiaohong',
age: 28
})
},
}
<button @click="setUserSecond({ name: 'xiaoli', age: 80 })">一秒后更新信息</button>
methods:{
...mapActions('user', ['setUserSecond'])
}
类别 | 直接使用模式 | 借助辅助方法使用 |
---|---|---|
state | $store.state.模块名.数据项名 | …mapState(‘模块名’, [‘数据项’]) 或 …mapState(‘模块名’, { 新的名字: 原来的名字 }) |
getters | $store.getters[‘模块名/属性名’] | …mapGetters(‘模块名’, [‘属性名’]) 或 …mapGetters(‘模块名’, { 新的名字: 原来的名字 }) |
mutations | $store.commit(‘模块名/方法名’, 其他参数) | …mapMutations(‘模块名’, [‘方法名’]) 或 …mapMutations(‘模块名’, { 新的名字: 原来的名字 }) |
actions | $store.dispatch(‘模块名/方法名’, 其他参数) | …mapActions(‘模块名’, [‘方法名’]) 或 …mapActions(‘模块名’, { 新的名字: 原来的名字 }) |
组件中使用方式 | 在组件中,使用 $store 对象进行数据和方法的获取 | 在组件中,使用扩展运算符直接调用属性和方法,例如 {{ age }} 或 @click=“updateAge(2)” |