vuex在Modules模块下之mapState,mapGetters,mapMutations,mapActions

文章介绍了Vuex的基础用法,包括无模块状态(state)和模块化状态管理。通过示例展示了如何在Vue组件中访问state,以及使用辅助函数mapState简化代码。此外,提到了项目结构中的不同情况,如无模块状态和模块化状态。

关于vuex的问题,我相信有很多小伙伴对他们是熟悉又陌生,熟悉的是写什么项目都能见到,陌生是因为有几天不用就忘了,所以针对这个问题,我给所有的小白新手特意出一期,包你看一遍就全懂了,如果有不懂的,下面留言。废话不多多说了,直接上代码。

咱们先说项目结构,一般会有两种情况:请看下面这段代码

import Vue from 'vue'
import Vuex from 'vuex'

import getters from './getters'

import app from './modules/app'
import master from './modules/master'
import order from './modules/order'

Vue.use(Vuex)
const state = {
  test: '这是测试数据'
}
const store = new Vuex.Store({
  modules: {
    app,
    master,
    order
  },
  getters,
  state
})

export default store

这段代码中,state就属于没有模块的状态,app,order,master就属于模块中的状态;兄弟,你看看你的属于哪一种情况然后再继续往下分;

我下面在写的时候,就把传统写法跟辅助函数写法都写一块了哈,大家直接做区分就可以了。

首先我们先获取state中的test(这种就属于没有Modules),在你的xxx.vue文件中这样写:

<template>
  <div>
    <span>{{ test }}</span>
  </div>
</template>

<script>
export default {
  computed: {
    test() {
      return this.$store.state.test
    }
  }
}
</script>

然后我们再用辅助函数进行写一遍:

<template>
  <div>
    <span>{{ test }}</span>
  </div>
</template>

<script>
import { mapState } from 'vuex'
export default {
  computed: {
    ...mapState(['test']) // 如果有多个属性,也可以...mapState(['test', 'test1', 'test2'])
  }
}
</script>

state到这就差不多结束了,如果大家觉得哪里还不懂,非常欢迎积极补充。

今天有点晚了,先写到这里,为了叫大家更详细的看清楚,所以写的有点慢。明天继续更新。。。  各位看官见谅。

<think>我们正在讨论Vuex的命名空间(namespace)功能,以及如何在启用了命名空间的模块中使用mapState,mapGetters,mapMutationsmapActions。根据引用内容,我们可以总结以下几点:1.辅助函数映射关系:mapStatemapGetters映射到计算属性(computed),而mapMutationsmapActions映射到方法(methods)。2.使用mapGetters的两种写法(对象写法和数组写法)。3.命名空间的问题:如果模块设置了命名空间,那么在映射时需要指定模块的路径。否则可能会报错“modulenamespacenotfound”(引用[3])。4.在创建store时,模块的命名空间是通过在模块定义中添加`namespaced:true`来启用的。接下来,我将给出一个示例,展示在设置了命名空间的模块中如何使用这些映射辅助函数。假设我们有一个名为`user`的模块,该模块启用了命名空间,其状态包括`name`和`age`,getters有`fullName`,mutations有`SET_NAME`,actions有`updateName`。模块定义如下(store/modules/user.js):```javascriptexportdefault{namespaced:true,//启用命名空间state:{name:'John',age:25},getters:{fullName(state){returnstate.name+'Doe';}},mutations:{SET_NAME(state,payload){state.name=payload;}},actions:{updateName({commit},payload){setTimeout(()=>{commit('SET_NAME',payload);},1000);}}};```在组件中,我们需要映射这个命名空间模块中的state,getters,mutations,actions。###使用示例首先,在组件的`<script>`部分,我们从vuex中导入所需的映射函数。```javascriptimport{mapState,mapGetters,mapMutations,mapActions}from'vuex';```然后,在计算属性中映射state和getters,在methods中映射mutations和actions。####1.使用数组形式映射数组形式适用于当映射的计算属性或方法与模块中的名称相同时。```javascriptcomputed:{//映射state中的name和age//注意:由于有命名空间,我们需要指定模块路径...mapState('user',['name','age']),//映射getters中的fullName...mapGetters('user',['fullName'])},methods:{//映射mutations中的SET_NAME//注意:mutations在methods中...mapMutations('user',['SET_NAME']),//映射actions中的updateName...mapActions('user',['updateName'])}```####2.使用对象形式映射对象形式可以给映射的属性或方法重命名。```javascriptcomputed:{//映射state,重命名...mapState('user',{userName:state=>state.name,userAge:'age'//也可以直接使用字符串,表示state.age}),//映射getters,重命名...mapGetters('user',{myFullName:'fullName'})},methods:{//映射mutations,重命名...mapMutations('user',{setName:'SET_NAME'}),//映射actions,重命名...mapActions('user',{changeName:'updateName'})}```###注意点-在映射时,第一个参数是模块的命名空间路径(字符串)。如果模块嵌套,则需要写完整的路径,例如:`mapState('moduleA/moduleB',...)`。-如果模块没有命名空间,那么这些映射将会注册到全局命名空间,第一个参数可以省略。###使用createNamespacedHelpers简化对于频繁使用同一个命名空间模块的情况,可以使用`createNamespacedHelpers`创建基于该命名空间的辅助函数。```javascriptimport{createNamespacedHelpers}from'vuex';const{mapState,mapGetters,mapMutations,mapActions}=createNamespacedHelpers('user');exportdefault{computed:{//直接映射,不需要再写命名空间...mapState(['name','age']),...mapGetters(['fullName'])},methods:{...mapMutations(['SET_NAME']),...mapActions(['updateName'])}};```这样,在组件中就不需要在每个映射函数中重复写命名空间路径了。###总结在Vuex中使用命名空间可以更好地组织代码,避免命名冲突。使用映射辅助函数时,需要提供命名空间的路径作为第一个参数。通过数组形式或对象形式可以灵活地映射模块中的state、getters、mutations和actions。此外,`createNamespacedHelpers`可以简化同一命名空间模块的映射。§§相关问题§§1.Vuex中,如何创建带命名空间的模块?2.如何在映射时处理嵌套的命名空间模块?3.除了映射辅助函数,还有哪些方法可以访问带命名空间模块的getters/actions等?</think> 在 Vuex 中使用命名空间(namespace)时,`mapState`、`mapGetters`、`mapMutations` 和 `mapActions` 的使用需要特别注意模块路径。以下是通过带命名空间的模块使用这些辅助函数的完整示例: ### 1. 带命名空间的模块定义 ```javascript // store/modules/user.js export default { namespaced: true, // 关键:启用命名空间 state: { name: '张三', age: 30 }, getters: { fullName(state) { return state.name + ' (用户)' } }, mutations: { SET_NAME(state, payload) { state.name = payload } }, actions: { updateName({ commit }, payload) { setTimeout(() => { commit('SET_NAME', payload) }, 1000) } } } ``` ### 2. 在组件中使用映射函数 #### 方法 1:通过字符串路径映射 ```javascript import { mapState, mapGetters, mapMutations, mapActions } from 'vuex' export default { computed: { // 映射状态 (对象形式) ...mapState('user', { userName: state => state.name, userAge: 'age' }), // 映射 getters (数组形式) ...mapGetters('user', ['fullName']) }, methods: { // 映射 mutations (对象形式) ...mapMutations('user', { setName: 'SET_NAME' }), // 映射 actions (数组形式) ...mapActions('user', ['updateName']), // 使用方法示例 updateUser() { this.setName('李四') // 调用 mutation this.updateName('王五') // 调用 action (异步) } } } ``` #### 方法 2:使用 createNamespacedHelpers (推荐) ```javascript import { createNamespacedHelpers } from 'vuex' const { mapState, mapGetters, mapMutations, mapActions } = createNamespacedHelpers('user') // 创建命名空间帮助函数 export default { computed: { // 不再需要指定模块...mapState(['name', 'age']), ...mapGetters(['fullName']) }, methods: { ...mapMutations(['SET_NAME']), ...mapActions(['updateName']), updateUser() { this.SET_NAME('李四') this.updateName('王五') } } } ``` ### ✨ 关键注意事项 ✨ 1. **启用命名空间**:模块中必须设置 `namespaced: true` ```javascript export default { namespaced: true, // ← 必须设置 // ...其他选项 } ``` 2. **路径格式**:多层嵌套模块使用 `/` 分隔 ```javascript // 嵌套模块示例 ...mapState('moduleA/moduleB', [...])) ``` 3. **解构冲突**:使用对象语法解决重名问题 ```javascript ...mapState('user', { userName: 'name', // 映射为本地 userName userAge: 'age' }) ``` 4. **异常处理**:未找到模块时会出现警告 ``` [vuex] module namespace not found in mapMutations() ``` > 提示:当看到 `module namespace not found` 错误时: > 1. 检查模块是否正确定义 > 2. 确认模块是否注册到 store > 3. 检查映射时的模块名拼写是否正确 > 4. 确认已设置 `namespaced: true` ### 完整组件使用示例 ```vue <template> <div> <p>姓名: {{ name }}</p> <p>全名: {{ fullName }}</p> <button @click="SET_NAME('赵六')">修改姓名</button> <button @click="updateName('钱七')">异步更新</button> </div> </template> <script> import { createNamespacedHelpers } from 'vuex' const { mapState, mapGetters, mapMutations, mapActions } = createNamespacedHelpers('user') export default { computed: { ...mapState(['name', 'age']), ...mapGetters(['fullName']) }, methods: { ...mapMutations(['SET_NAME']), ...mapActions(['updateName']) } } </script> ``` 通过命名空间可以将 Vuex 模块封装为独立的功能单元,避免状态和方法命名冲突,使代码组织结构更清晰可维护。实际开发中推荐使用 `createNamespacedHelpers` 方式简化映射逻辑[^1][^3][^4]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值