vuex 多模块时 模块内部的mutation和action的调用方式

       vue在做大型项目时,会用到多状态管理,vuex允许我们将store分割成多个模块,每个模块内都有自己的state、mutation、action、getter。模块内还可以继续嵌套相对应的子模块。

       为了巩固我自己对store多模块的一些基本认识,写了个简单的多模块实例,下图为我自己创建的store的目录结构,modules文件夹内的模块,在实际项目中还可以继续分开类似store目录下的多文件结构,也就是单独的模块文件夹,方便后期修改。

store目录结构

       ./store/index.js的代码如下:

import Vue from 'vue'
import Vuex from 'vuex'
// import mutations from './mutations'
import modulesA from './modules/modulesA'
import modulesB from './modules/modulesB'

Vue.use(Vuex)

const state = {
  logined: false,
  userid: -1
}

const store = new Vuex.Store({
  state,
  mutations: {
    'UPDATE_LOGIN_STATUS': (state, payload) => {
      state.logined = true
    }
  },
  modules: {
    modulesA: modulesA,
    modulesB: modulesB
  }
})

export default store

       这里为了方便和子模块进行对比,我将mutations.js的代码放到index.js里面

       modulesA.js的代码如下:

const moduleA = {
  namespaced: true,
  state: {
    isVip1: false
  },
  mutations: {
    'UPDATE_TO_VIP1': (state, payload) => {
      state.isVip1 = true
    }
  },
  actions: {
    getVip1 ({ state, commit, rootState }) {
      commit('UPDATE_TO_VIP1')
    }
  },
  getters: {}
}

export default moduleA

       modulesB.js的代码如下:

const moduleB = {
  // namespaced: true,
  state: {
    isVip2: false
  },
  mutations: {
    'UPDATE_TO_VIP2': (state, payload) => {
      state.isVip2 = true
    }
  },
  actions: {
    getVip2 ({ state, commit, rootState }) {
      commit('UPDATE_TO_VIP2')
    }
  },
  getters: {}
}

export default moduleB

       估计看到这里,你会发现modulesA和modulesB的区别就是有无namespaced这个属性。在vuex内,模块内部的action、mutation、getter都会被注册在全局命名空间内,俗话就是注册成全局的,这样做的结果就是在调用相对应的名字的的action或者mutation或者getter的时候,所有同名的都将会被响应。让我们来看看当没有namespaced(或者值为false)的时候,在组件内是怎么调用的,这里代码如下:

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <ul>
      <li>global state <strong>logined</strong>: {{ globalState }}</li>
      <li>modulesA state <strong>isVip1</strong> {{ modulesAState }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'test',
  data () {
    return {
      msg: 'Test vuex mutilple modules'
    }
  },
  created () {
    console.log(this.$store.state)
    setTimeout(() => {
      this.$store.commit('UPDATE_LOGIN_STATUS')
    }, 1000)
    setTimeout(() => {
      this.$store.commit('UPDATE_TO_VIP1')
      // this.$store.dispatch('getVip1')
    }, 2000)
    setTimeout(() => {
      // this.$store.commit('CANCEL_VIP1')
      this.$store.dispatch('cancelVip1')
    }, 3000)
  },
  computed: {
    globalState () {
      return this.$store.state.logined
    },
    modulesAState () {
      return this.$store.state.modulesA.isVip1
    }
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>

       执行代码的截图如下:

       可以看到,我在store里面commit一个UPDATE_LOGIN_STATUS,将最顶层state中的logined的值改为true。2s的时候在store里面commit了UPDATE_TO_VIP1和3s的时候dispatch了一个事件CANCEL_VIP1,将modulesA的isVip1的值从false => true => false。说明没有开启命名空间是可以直接commit或者dispatch子模块内相对应的方法名,是可以修改到自身state中的属性的。

       如果namespaced的值为true时,那么就是开启了命名空间模块,调用子模块的getter、mutation、getter的时候就跟之前不一样了,vuex它内部会自动根据模块注册的路径调整命名,比如要dispatch B中的一个action的话,那么组件内的调用就应该是如下这样的:

// this.$store.dispatch('modulesB/getVip2')
this.$store.commit('modulesB/UPDATE_TO_VIP2')

       日常项目中,在store有多个状态需要管理的时候,一般来说是应该要开启namespaced的,这样子能够使我们的代码能够有更强的封装性以及更少的耦合。

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vuex是一个专为Vue.js应用程序开发的状态管理模式。它允许我们在应用的不同组件间共享和管理状态。在Vuex中,可以通过模块化的方式来组织和管理不同部分的状态。 使用Vuex模块调用mutation非常简单。首先,我们需要在store文件夹中创建一个新的模块文件。 在这个模块文件中,我们可以定义自己的状态state、修改状态的mutation以及处理异步操作的action。接着,我们需要在store文件夹的index.js文件中导入新创建的模块,并将其添加到modules对象中。 最后,我们就可以在组件中使用this.$store来调用模块中定义的mutation了。我们可以使用mapMutations方法将mutation映射到组件的methods中,然后就可以在组件中直接调用映射的方法来修改模块中的状态了。 例如,假设我们有一个模块叫做user,其中定义了一个mutation叫做SET_USER,用于设置用户信息。那么我们可以在组件中使用以下方式调用mutation: 1. 导入mapMutations方法:import { mapMutations } from 'vuex'; 2. 将SET_USER mutation映射到组件的methods中:methods: { ...mapMutations('user', ['SET_USER']) } 3. 在需要修改用户信息的地方调用SET_USER方法:this.SET_USER(userInfo); 通过以上的步骤,我们就可以在组件中调用模块中的mutation,并且将相关的状态进行修改了。 总之,Vuex模块调用mutation非常方便。我们只需要按照上述步骤在store文件夹中创建新的模块文件,并将其导入并配置到index.js中,然后在组件中使用mapMutations方法来映射mutation并在需要的地方进行调用即可。这样可以使得代码更加模块化和可维护性更高。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值