1.什么是状态:
可以理解为在data中的属性需要分享给其他vue组件使用的部分,就叫做状态。简单的说就是data中需要共有属性。
例如:在中大型项目中会有很多共用的数据。我们有几个页面同时显示用户的名称和用户等级,如果不把这些属性设置为状态,那每个页面遇到后,都会到服务器进行查找计算,返回后再显示。这样消耗大量性能,得不偿失,而vuex是一个很好的解决方法。
2.安装
·npm install vuex --save/cnpm install vuex --save
3.引入
·import Vue from 'vue'
·import Vuex from 'vuex'
Vue.use(Vuex);
4.实例
·现在我们新建store.js文件,在里面增加一个常量对象。store.js文件就是我们引入vuex时的那个文件。
const state={
count:1
}
·用export default封装代码,让外部可以引用
export default new Vuex.Store({
state
})
·新建一个vue的模版,位置在components文件夹下,名字叫count.vue,在模版中我们引入我们刚建的store.js文件,并在模版中用$store.state.count输出count的值。
{{msg}}
{{$store.state.count}}
import store form '@/vuex/store'
export default{
data(){
return{
msg:'Hello Vuex',
}
},
store
}
·在store.js文件中加入两个改变state的方法
const mutations={
state.count++;
},
reduce(state){
state.count--;
}}
注:这里的mutations时固定的写法,意思是改变的,要改变state的数值的方法必须写在mutations里。
·在count.vue模版中加入两个按钮,并调用mutations中的方法
注:这样进行预览就可以实现对vuex中的count进行加减了。
·将状态对象赋值给内部对象,也就是把stroe.js中的值赋值给我们模版中data中的值(读取数据)。三种方法:
1)通过computed的计算属性直接赋值
注:computed属性可以在输出前,对data中的值进行改变,我们就利用这种特性把store.js中的state值赋值给我们模版中的data值。
computed:{
count(){
return this.$store.state.count;
}
}
注:这里需要注意的是return this.$state.count这一句,一定要写this,不然找不到$store。这种方法很好理解,写起来复杂。
2)通过mapState的对象来赋值
我们首先要用import引入mapState:
import {mapState} from 'vuex';
然后还在computed计算属性里写如下代码:
computed:mapState({
count:state=>state.count
})
注:这里我们使用ES6的箭头函数来给count赋值
3)通过mapState的数组来赋值:
computed:mapState([""count])
注:这个算是最简单的写法,在实际项目开发中也经常这样使用。
·Mutations修改状态(修改数据)
·$store.commit()
Vuex提供commit方法来修改状态,我们在button上修改方法:
·store.js 文件:
const mutations={
add(state){
state.count++;
},
reduce(state){
state.count--;
}
}
·传值:这只是一个最简单的修改状态的操作,在实际项目中我们常常需要在修改状态时传值。比如上边的例子,是我们每次只加1,而现在我们要通过所传的值进行相加。只需要在Mutations里再加上一个参数,并在commit的时候传递。
注意:现在store.js文件里给add方法加上一个参数n。
const mutations={
add(state,n){
state.count+=n;
},
reduce(state){
state.count--;
}
}
·在Count.vue里修改按钮commit()方法传递的参数,我们传递10;意思是每次加10
注:这样两个简单的修改我们就完成了传值。
·模版获取Mutations方法
实际开发中我们也不喜欢看到$store.commit()这样方法出现,希望跟调用模版里的方法一样调用
例如:@click="reduce"就和没引用vuex插件一样
要达到这种写法,只需要两步:
1)在模版count.vue里用import引入我们的mapMutations:
import {mapState,mapMutations} from 'vuex';
2)在模版的