当需要在 Vuex 里做大量代码操作时整个文件会变得特别乱,代码会变的不是很好梳理,而 Vuex 中的 modules 属性解决了这个问题Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割。
const store= new Vuex.Store({
state: {
},
mutations: {
},
actions:{
},
getters: {
},
modules:{
mk1:{
state: {
},
mutations: {
},
actions:{
},
getters: {
},
modules:{
}
},
mk2:{
state: {
},
mutations: {
},
actions:{
},
getters: {
},
modules:{
}
}
}
})
const mk1={
state: {
},
mutations: {
},
actions:{
},
getters: {
},
modules:{
}
}
const mk2={
state: {
},
mutations: {
},
actions:{
},
getters: {
},
modules:{
}
}
const store= new Vuex.Store({
state: {
},
mutations: {
},
actions:{
},
getters: {
},
modules:{
mk1,
mk2
}
})
外部文件 1 的 js
const mk1={
state: {
},
mutations: {
},
actions:{
},
getters: {
},
modules:{
}
}
export default mk1;
外部文件 2 的 js
const mk2={
state: {
},
mutations: {
},
actions:{
},
getters: {
},
modules:{
}
}
export default mk2;
vuex 的 js 文件
// 引入两个单独的模块
import mk1 from "./mk1.js"
import mk2 from "./mk2.js"
const store= new Vuex.Store({
state: {
},
mutations: {
},
actions:{
},
getters: {
},
modules:{
mk1,
mk2
}
})
export default mk2;
给定义好的模块里写上 namespaced: true 就会打开命名空间。
命名空间开启后会起到一个隔离的作用调用的时候需要加上要调用方法的路径才能调用。
如果没有开启命名在调用像 mutations 和 actions 这样的用 commit 和 dispatch 调用方法的时候会把同名的方法全部执行,开启后则不会全部执行,他会根据你的调用路径来判断是否执行该方法
const store= new Vuex.Store({
state: {
name:"李四"
},
mutations: {
},
actions:{
},
getters: {
},
modules:{
mk1:{
namespaced: true,
state: {
name:"张三"
},
mutations: {
},
actions: {
},
getters: {
},
modules:{
}
}
}
})
const store= new Vuex.Store({
state: {
name:"李四"
},
mutations: {
},
actions:{
},
getters: {
},
modules:{
mk1:{
state: {
name:"张三"
},
mutations: {
},
actions: {
},
getters: {
},
modules:{
}
}
}
})
如何调用 modules 中mk1 下的 state 里面的 name
<template>
<div id="app">
{
{this.$store.state.mk1.name}}
div>
template>
const store= new Vuex.Store({
state: {
name:"李四"
},
mutations: {
xiu(){
console.log("我是最外面的xiu方法")
}
},
actions:{
},
getters: {
},
modules:{
mk1:{
namespaced: true,
state: {
name:"张三"
},
mutations: {
xiu(state){
// 第一个参数时当前模块的 state 第二个参开始是传入的参数
console.log("我是mk1下的xiu方法")
}
},
actions: {
},
getters: {
},
modules:{
}
}
}
})
如何调用 Modules 下的 mutations属性 下面是开启命名空间的语法
<template>
<div id="app">
{
{ this.$store.state.mk1.name }}
<button @click="fun">123button>
div>
template>
<script>
export default {
name: "App",
methods: {
fun(){
this.$store.commit("xiu") // 调用全局的 xiu 方法
// 开启命名空间后使用方法
this.$store.commit("mk1/xiu") // 调用mk1下的 xiu 方法
}
},
};
script>
const store= new Vuex.Store({
state: {
name:"李四"
},
mutations: {
},
actions:{
xiu(store){
// 第一个参数时当前模块的 store 第二个参开始是传入的参数
console.log(stroe)
}
},
getters: {
},
modules:{
mk1:{
namespaced: true,
state: {
},
mutations: {
},
actions: {
xiu(store){
// 第一个参数时当前模块的 store 第二个参开始是传入的参数
console.log(stroe)
},
// 在局部模块中注册全局方法
haha:{
// 开启全局声名
root: true,
// 默认执行函数
handler(){
console.log("我是局部模块中的全局方法")
}
}
},
getters: {
},
modules:{
}
}
}
})
如何调用 Modules 下的 actions属性 下面是开启命名空间的语法
<template>
<div id="app">
{
{ this.$store.state.mk1.name }}
<button @click="fun">123button>
div>
template>
<script>
export default {
name: "App",
methods: {
fun(){
this.$store.dispatch("xiu") // 调用全局的 xiu 方法
// 开启命名空间后使用方法
this.$store.dispatch("mk1/xiu") // 调用mk1下的 xiu 方法
// 调用局部模块中的全局方法
this.$store.dispatch("haha")
}
},
};
script>
!!!在没有开启命名空间的时候 getters 下面的方法不能于外层重名 会出错
export default new Vuex.Store({
state: {
name: "123"
},
mutations: {
},
actions: {
cc(a, b, c) {
}
},
getters: {
haha(a, b, c, d) {
console.log(a) // 全局 state
console.log(b) // gettes 下的全部方法
console.log(c) // 全局 state
console.log(d) // gettes 下的全部方法
}
},
modules: {
mk1: {
namespaced: true,
state: {
name: "haha"
},
mutations: {
},
actions: {
},
getters: {
haha1(a, b, c, d) {
console.log(a) // 当前模块的 state
console.log(b) // 当前模块的 gettes
console.log(c) // 全局下的 store
console.log(d) // gettes 下的全部方法
}
},
modules: {
}
}
}
})
如何调用 Modules 下的 getters属性 下面是开启命名空间的语法
<template>
<div id="app">
{
{ this.$store.getters.haha }}
{
{ this.$store.getters['mk1/haha1'] }}
<button @click="fun">123button>
div>
template>
<script>
export default {
name: "App",
methods: {
fun(){
// this.$store.dispatch("cc")
console.log(this.$store.getters)
}
},
};
script>
使用方法同上调用方法在加一层路径就好
Vuex 的映射方法