这篇文章主要介绍了vuex中modules的基本用法。

1. store文件结构

1
2
3
4
5
6
7
- src
- components
- store
-index.js
-modules
-app.js
-bus.js

2.1index.js中-手动引入modules

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import Vue from 'vue'
import Vuex from 'vuex'

import bus from './module/bus'
import app from './module/app'

Vue.use(Vuex)
export default new Vuex.Store({
state: {
// 这里是根vuex状态
},
mutations: {
// 这里是根vuex状态
},
actions: {
// 这里是根vuex状态
},
modules: { // 子vuex状态模块注册
namespaced: true, // 为了解决不同模块命名冲突的问题
app,
bus
}
})

2.2 index.js中-动态引入modules

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const dynamicModules = {}
const files = require.context('.', true, /\.js$/)

const dynamicImportModules = (modules, file, splits, index = 0) => {
if (index == 0 && splits[0] == 'modules') {
++index
}
if (splits.length == index + 1) {
if ('index' == splits[index]) {
modules[splits[index - 1]] = files(file).default
} else {
modules.modules[splits[index]] = files(file).default
}
} else {
let tmpModules = {}
if ('index' == splits[index + 1]) {
tmpModules = modules
} else {
modules[splits[index]] = modules[splits[index]] ? modules[splits[index]] : {namespaced: true, modules: {}}
tmpModules = modules[splits[index]]
}
dynamicImportModules(tmpModules, file, splits, ++index)
}
}

files.keys().filter(file => file != './index.js').forEach(file => {
let splits = file.replace(/(\.\/|\.js)/g, '').split('\/');
dynamicImportModules(dynamicModules, file, splits)
})

export default new Vuex.Store({
modules: dynamicModules,
strict: process.env.NODE_ENV !== 'production'
})

3 app.js文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const state = {
user: {}, // 需要管理的状态数据
}

const mutations = {
setUser (state, val) {
state.user = val
}
}
const getters = {}
const actions = {}

export default {
namespaced: true,
state,
mutations,
getters,
actions
}

4.1 使用 a.vue页面

1
2
3
4
5
6
// 使用模块中的mutations、getters、actions时候,要加上模块名,例如使用commint执行mutations时
// 格式: 模块名/模块中的mutations
this.$store.commit("app/setUser", user)

// 获取属性时同样加上模块名
this.$store.state.app.user

4.2 utils.js中使用

1
2
3
4
5
6
7
8
9
10
11
12
// 引入 这里的store 就相当于页面中的 this.$store
import store from '@/store'

export const setCurUser = (user) => {
let curUser = store.app.user
if(!curUser) {
store.commit("app/setUser", user)
return user
}

return curUser
}

5 配置main.js

1
2
3
4
5
6
7
8
9
10
11
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store'

new Vue({
el: '#app',
router,
store,
render: h => h(App)
})