Vuex之State、Mutation、Action、Getter

store的文件夹下的index.js文件的内容如下:

//引入vue和vuex
import Vue from  'vue';
import Vuex from 'vuex';

//将vuex和vue绑定,让vue可以使用vuex
Vue.use(Vuex);

//将store对象暴露成默认对象
export  default  new Vue.Store({
	//声明全局的数据对象
	state:{
		属性名:属性默认值
	},
	actions:{},
	mutations:{}
})

Vuex有三部分组成:stateactionsmutations

state

state一般中用来定义全局的数据源。
例如:
声明定义

  //声明全局变量
    state: {
      num:10,
      count:20
    }

访问方式1
 在组件中就可以直接通过this.$store.state.变量名获取值了,这种方式也是默认访问的方式。
 
访问方式2
 将全局数据,定义成当前组件的计算属性。

<script>
	import {mapState} from 'uvex';
	export default{
		data(){
			return{
				
			}
		},
		method:{},
		computed:{
			//将state中的属性映射成计算属性
			 ...mapState(['num','count'])
		}
	}
</script>

在该组件中,就可以直接使用numcount了。
例如:

<span>num:{{num}}</span>
<span>count:{{count}}</span>

效果图
在这里插入图片描述

组件中直接操作state中的变量。
错误写法

//直接在组件中修改num的值
testVuex:function(){
  this.$store.state.num=1000;
}

效果图
在这里插入图片描述
在这里插入图片描述
当点击测试按钮之后,num的值变成了1000,页面上也有更新,但是浏览器上的插件并没有监听到。所以一般不要这样去使用,而是使用mutations去修改num的值。



mutations

mutation一般用来定义方法,修改state中的数据。通常也只能在Mutation中修改state声明的数据。

例如:
声明定义

  mutations: {
      //state参数值的就是上面的state,这里的state只是一个参数名,可以随便起
      addNum(state){
        state.num=100;
      },
      addNum2(state,step){
        state.num+=step;
      }
    }

组件中调用mutations中的方法

访问方式1

 testVuex:function(){
 	 //调用addNum(state)方法,state是默认属性
     this.$store.commit('addNum');
      //调用addNum(state,step)方法
     this.$store.commit('addNum2',2);
}

方式方式2

//按需引入mapMutations
import {mapMutations} from 'vuex'

export default {
	method:{
		//将Mutation中方法映射成普通方法。
		...mapMutations(['addNum','addNum2']),
		add:function(){
			//这时候addNum和addNum2就跟普通的method方法一样了
			this.addNum2(3);
		}
		
	}
}

效果图
在这里插入图片描述
浏览器的监控插件中也能监听到。
在这里插入图片描述



 在mutation中使用异步操作的方式去修改state中的值,虽然这样可以修改成功,并且在视图层也能响应,但是在调试工具dev-tool中无法监听到这些变化。所以就使用actions的方式去进行异步操作。



actions

mutations中一般不直接使用异步操作方式修改state的全局变量,但actions中又不能直接修改state中的值。因此一般在actions中进行异步操作,然后在调用mutations中的方法。

例如:
声明定义

 actions: {
 	  //这里的state和mutations中的state参数一样,是固定写法,该参数可以随便写。
      asynChangeNum(state,step){
        setTimeout(()=>{state.commit('addNum2',step);},2000)
      }
    }

组件中调用
方式1

export default{
	method:{
		changeNum:function(){
			this.$store.dispatch('asynChangeNum',3);
		}
	}
}

方式2

//引入mapActions
import  {mapActions} from 'vuex';

export default{
	method:{
		//将Actions中的方法映射成普通方法
		...mapActions(['asynChangeNum']),
		changeNum:function(){
			this.asynChangeNum(3);
		}
	}
}

效果图
在这里插入图片描述
在这里插入图片描述



Getter

Getter用于对Store中的数据进行加工处理形成新的数据。类似于Vue中的计算属性。
 当Store中的的数据发生变化,Getter的数据也会跟着发生改变。

声明:

getter:{
	showNum(state){
		return "state中的数据为:"+state.count;
	}
}

使用:
方式1

//直接在组件中使用
{{this.$store.getters.showNum}}
或者
{{$store.getters.showNum}}

方式2

<template>
	<div>
		{{showNum}}
	</div>
</template>

<script>
	//使用mapGetters
	import  {mapGetters}  from "vuex";
	
	export default{
		computed:{
				//将getters映射成计算属性
				 ...mapGetters(['showNum'])
			}
	}
</script>




注意
 1、mutations中的方法,一般不能以异步的方式操作state中的变量,因为虽然视图上能更新数据,效果也有,但是dev-tool插件没有办法监听到mutations中异步数据的变化。
 2、actions中可以直接执行异步操作数据,actions中无法直接操作state的数据,所以一般会在action中定义方法,然后再调用mutations中的方法,从而间接修改了state中的值。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值