vuex+映射

目录

一、vuex作用

二、五个属性方法

state   

getters 

mutations 

 actions  

 modules

访问或使用模块中的数据或方法 

 三、前四种方法用法图示

四、vuex的4个map映射方法 

1、mapState方法

2、mapGetters方法

3、mapActions方法

​4、mapMutations方法

mapActions与mapMutations注意:

五、使用模块化后的vuex4个map映射方法

1、创建模块时开启命名空间

2、注册子模块

3、使用四种map映射方法

六、模块化后正常写法与映射写法总结 


一、vuex作用

  • vuex是vue的全局状态的管理工具
  • vuex数据更新,其引用组件都会响应式的更新
  • 如果项目不大,不建议使用vuex

二、五个属性方法

state   

作用:

  • 存放数据的地方
  • vuex中的state数据同渲染指令可以渲染到vue组件中(响应式更新:数据变化视图会自动更新)

组件中使用方法:$store.state.xxx
实例:

// state存储数据的地方
	state: {
		cartNum: 10,
		price: 255,
	},
<p>商品数量 {{$store.state.cartNum}}</p>

getters 

作用:从现有数据计算出新的数据
组件中使用方法:$store.getters.xxx
实例:

// 从现有数据计算出新的数据
	getters: {
		// 价格的百分50%
		// 从现有的价格计算出fee
		fee: function(state) {
			return state.price * 0.5;
		}
	},
<p>商品的提成:{{$store.getters.fee}}</p>

mutations 

作用:mutations是改变vuex state中数据的唯一方式
组件中使用方法:$store.commit(方法,数据)
实例:

// mutations是改变数据state的唯一方式
	// 建议大写
	mutations: {
		// 更改购物车的数量
		SET_CARTNUM(state, data) {
			state.cartNum = data;
		}
	},
<!-- mutations改变cartNum  commit 提交-->
<button @click="$store.commit('SET_CARTNUM',18)"> 改变购物车18</button>

上方简单使用方式只能单个方法对应修改单个数据,下方来拓展延伸下

实现方法的公用性
同一方法修改多个数据
mutations: {
    setAppState(state, [key, value]) {
      state[key] = value;
    },
}
传入不同数据进行修改
this.$store.commit('setAppState', ["flag", true])

其他方法大家可尝试扩展。

 actions  

作用:

  • actions动作,异步,延迟方法,不能直接修改state
  • actions通过 commit 执行 mutations中的方法


组件中使用方法:$store.dispatch(方法,数据)
实例:

// actions动作,异步,延迟方法,不能直接修改state
	actions: {
		setCart(context, data) {
			setTimeout(() => {
				// context就是$store
				// 等待4秒把执行SET_CARTNUM,传参参数data
				context.commit("SET_CARTNUM", data)
			}, 4000)
		}
	},
<button @click="$store.dispatch('setCart',100)">等4秒把购物车数量改为100</button>

actions案例二:axios请求

 modules

介绍:把store分为很多小模块,每一个模块都有自己的state,getters,action,mutation属性,最后合并到一起

使用:新建组件,导入新组件,方法中注册组件

访问或使用模块中的数据或方法 

注意:访问模块中的数据需要在state后加模块名称,访问模块中的方法则不需要。

方式一(便捷):(注意:getters需要开启命名空间)

自定义user模块内代码展示

export default {
    namespaced:true, // 使用模块化时getters需要开启命名空间才能访问到,否则为undefined
    state: {
        list: {
            name: "彭于晏"
        }
    },
    mutations: {
        SET_LIST(state, data) {
            state.list.name = data;
        }
    },
    getters: {
      feeNum(state) {
        return state.num + 1
      },
    },
}

访问数据举例
this.$store.state.user.list.name
this.$store.getters['moduleOne/feeNum']; 注意开启命名空间
访问方法举例---mutations、actions均无需加模块名
this.$store.commit('SET_LIST','胡歌')

方式二(正规但繁琐):

 三、前四种方法用法图示

四、vuex的4个map映射方法 

1、mapState方法

前言:当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性。

未使用mapState映射:

不声明为计算属性直接使用
{{$store.state.sum}}

声明为计算属性再使用
{{sum}}
computed:{
  sum(){
    return this.$store.state.sum;
  },
  sumTwo(){
    return this.$store.state.sumTwo;
  },
}
可以看到以上两种方式使用代码重复率太高,太过冗余

使用mapState映射流程

import {mapState} from 'vuex'; // 需要使用mapState的组件引入
computed:{
  // 对象写法 可修改state状态名称如:sum 改为 sumNum
  ...mapState({sumNum:'sum',sumNumTwo:'sumTwo'}),
  // 数组写法 只可与state状态名称一一对应,不可修改状态名称
  ...mapState(['sum','sumTwo']),
}

2、mapGetters方法

前言:同mapState原理相同

未使用mapGetters映射:

不声明为计算属性直接使用
{{$store.getters.bigSum}}

声明为计算属性再使用
{{bigSum}}
computed:{
  bigSum(){
    return this.$store.getters.bigSum;
  }
}
可以看到以上两种方式使用代码重复率太高,太过冗余

 使用mapGetters映射流程

import {mapGetters} from 'vuex'; // 需要使用mapGetters的组件引入
computed:{
  // 对象写法 可修改getters方法名称如:bigSum 改为 bigSumGets
  ...mapGetters({bigSumGets:'bigSum',sumGets:'sum'}),
  // 数组写法 只可与getters方法名称一一对应,不可修改方法名称
  ...mapGetters(['bigSum',sum]),
}

3、mapActions方法

未使用mapActions映射调用actions内的方法:

this.$store.dispatch('jiaOdd',this.n);

 使用mapActions映射流程

import {mapActions} from 'vuex'; // 需要使用mapActions的组件引入
methods:{
  // 靠mapActions生成:incrementOdd、incrementWait方法(对象形式)
  // 将vueX中actions的方法jiaOdd名称改为incrementOdd
  ...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
  // 靠mapActions生成:incrementOdd、incrementWait方法(数组形式)
  ...mapActions(['jiaOdd','jiaWait'])
},

使用mapActions映射调用actions内的方法:
对象形式:(使用修改后的名称)
this.incrementOdd(参数) 或 <button @click="incrementOdd("参数")" >按钮</button>
数组形式:(只能使用actions内的名称)
this.jiaOdd(参数) 或 <button @click="jiaOdd("参数")" >按钮</button>

4、mapMutations方法

 未使用mapActions映射调用actions内的方法:

this.$store.commit('JIAN',this.n);

  使用mapActions映射流程

import {mapActions} from 'vuex'; // 需要使用mapActions的组件引入
methods:{
  // 借助mapMutations生成:incrementOdd、incrementWait方法(对象形式)
  // 将vueX中mutations的方法jiaOdd名称改为incrementOdd
  ...mapMutations({increment:'JIA',decrement:'JIAN'})
  // 靠mapMutations生成:incrementOdd、incrementWait方法(数组形式)
  ...mapMutations(['JIA','JIAN'])
},

使用mapMutations映射调用mutations内的方法:
对象形式:(使用修改后的名称)
this.increment(参数) 或 <button @click="increment("参数")" >按钮</button>
数组形式:(只能使用mutations内的名称)
this.JIA(参数) 或 <button @click="JIA("参数")" >按钮</button>

mapActions与mapMutations注意:

五、使用模块化后的vuex4个map映射方法

前言:一般开发中,我们会将vuex进行模块化分类,但分类后的数据使用map映射方法需要做些配置和改动,具体如下。

1、创建模块时开启命名空间

namespaced:true, // 模块中添加改配置开启命名空间

 

2、注册子模块

3、使用四种map映射方法

六、模块化后正常写法与映射写法总结 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值