vuex模块化

当项目变得复杂时,Vuex的模块化能帮助整理store。本文介绍了如何创建模块A和模块B,包含各自的state、mutation、action和getter,并展示了在项目中如何通过命名空间访问和操作这些模块的数据。同时,通过示例演示了使用mapState、mapMutations、mapActions和mapGetters辅助函数的方法。
摘要由CSDN通过智能技术生成

vuex模块化

当我们开发的项目比较大时,store中的数据就可能比较多,这时我们store中的数据就可能变得臃肿,为了解决这一问题,我们就需要将store模块化(module),即每个模块拥有自己的state、mutation、action、getter、甚至是嵌套子模块

注意:被模块化的store须要开启命名空间

模块A:a.js

export default {
    namespaced: true,//开启命名空间
    state: {
    	sum:0,
    	number:0
    },
    mutations: {
    	ADD_NUM(state,value){
  			state.sum+=value
  		}
    },
    actions: {
    },
}

模块B:b.js

export default {
    namespaced: true,//开启命名空间
    state: {
    	name:'张三',
    	personList:[]
    },
    mutations: {
    	ADD_PERSON(state,value){
    		state.personList.unShift(value)//把数据添加到数组的首位
    	}
    },
    actions: {
    	addZhang(context,value){
    		//value参数是一个对象
    		if(value.name.indexOf('张')===0){
    			context.commit('ADD_PERSON')
    		}else{
    			alert('这个人不姓张!')
    		}
    	},
    	addServer(context,value){
    		axios.get('https://api.uixsj.cn/hitokoto/get?type=social').then(res=>{
    			context.commit('ADD_PERSON',{name:res.data})
    		},error=>{
    			alert(error.message)
    		})
    	}
    },
    getters: {
    	firstName(state,getters){
 			return state.personList[0].name+',你好!'
 		}
    }
}

store/index.js:在modules中引入

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

//引入
import moduleA from './a.js'
import moduleB from './b.js'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {//模块化
    moduleA,
    moduleB
  }
})

这时我们在项目中如何取用呢?

  1. 访问state数据:
    第一种方式:this.$store.state.moduleA.sum
    第二种方式:
 import {mapState} from 'vuex'
 computed:{
 	...mapState('moduleA',['sum','number'])
 }
  1. 修改state数据:
    第一种方式:this.$store.commit('moduleA/ADD_NUM',10)
    第二种方式:
 import {mapMutations} from 'vuex'
 methods:{
	...mapMutaions('moduleA',['ADD_NUM']),
 	}
  1. action提交mutation:
    第一种方式:this.$store.dispatch('moduleB/addZhang',{name:'小明',age:18}) this.$store.dispatch('moduleB/addServer')
    第二种方式:
 <button @click="addZhang({name:'张2'})">添加姓张的人+</button>

 import {mapActions} from 'vuex'
 methods:{
 	...mapActions('moduleB',['addZhang']),//参数在调用时传递 addZhang({name:'小明',age:18})
 }
  1. getters ,store的计算属性(加工数据)
    第一种方式:this.$store.getters['moduleB/firstName']
    第二种方式:
 import {mapGetters} from 'vuex'
 computed:{
 	...mapGetters('moduleB',['firstName'])//数组写法(简写)
 }
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值