Vuex之module的使用

module一般我们用来以功能为单位拆分模块,使模块具有更高的封装度和复用性
每个模块都拥有自己的state、mutation、action、getter
根节点的状态为context.rootState
简单使用
新建一个module
import { createStore } from "vuex"

const muduleA = {
    state: () => {
        return {
            personNum: 0
        }
    },
    mutations: (state) => {
        state.personNum++;
    }
}

// 创建一个新的 store 实例
const store = createStore({
    state() {
        return {
            seyHello: "Hello World"
        };
    },
    modules: {
        muduleA
    }
});

export default store
 
代码的简单解释
一个module其实就是一个对象,对象里面含有vuex的state、mutation、action、getter
写完的配置,我们最终要在createStore的modules下引入
在组件中的使用
<script>
import { mapMutations, mapState } from 'vuex';

export default {
    methods: mapMutations(["increment"]),
    computed:mapState({
        person: state => state.muduleA.personNum
    })
}
</script>

<template>
    <p>personNum:{{ person }}</p>
    <button @click="increment">changeNum</button>
</template>
 
对于代码的解释
在组件中,我们取module下的状态就会发现是state.muduleA.personNum
但是我们会发现我们取module的时候,相关的mutation的取法并没有加上muduleA之类的写法,这会导致当我们其他模块有同名的mutation的时候会导致混淆,我们会用命名空间来解决这个问题
命名空间
注册module
import { createStore } from "vuex"

const muduleA = {
    namespaced: true,
    state: () => {
        return {
            personNum: 0
        }
    },
    mutations: {
        increment: state => {
            state.personNum++;
        }
    }
}

// 创建一个新的 store 实例
const store = createStore({
    state() {
        return {
            seyHello: "Hello World"
        };
    },
    modules: {
        muduleA
    }
});

export default store
 
我们会发现如果想要是用命名空间,那么,只需要在相关的module的对象下,加一个namespace:true就可以了
使用
<script>
import { mapMutations, mapState } from 'vuex';

export default {
    methods: mapMutations({
        increment: "muduleA/increment"
    }),
    computed: mapState({
        person: state => state.muduleA.personNum
    })
}
</script>

<template>
    <p>personNum:{{ person }}</p>
    <button @click="increment">changeNum</button>
</template>
 
添加了命名空间主要是我们在使用的时候就应该加上了命名空间的名字increment: "muduleA/increment"
嵌套的module
当然我们的module也可以嵌套,子的module如果没有命名空间的话,会继承父的命名空间

const store = createStore({
  modules: {
    account: {
      namespaced: true,

      // 模块内容(module assets)
      state: () => ({ ... }), // 模块内的状态已经是嵌套的了,使用 `namespaced` 属性不会对其产生影响
      // 嵌套模块
      modules: {
        // 继承父模块的命名空间
        myPage: {
            ...
        },
        // 进一步嵌套命名空间
        posts: {
          namespaced: true,
          ...
        }
      }
    }
  }
})

文章知识点与官方知识档案匹配,可进一步学习相关知识
————————————————
版权声明:本文为CSDN博主「youhebuke225」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/youhebuke225/article/details/125366410

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值