前端

Vuex

2018-04-09  本文已影响26人  强某某

vuex的语义

vuex是一个专门为vue.js设计的集中式状态管理架构,简单的说就是data中需要共用的属性。

安装vuex

cnpm install vuex --save

入门案例

新建vuex文件夹在src下面,然后在内部
新建store.js文件。
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);

const state={
    count:1
}
const mutations={
    add(state){
        state.count++;
    },
    reduce(state){
        state.count--;
    }
}
export default new Vuex.Store({
    state,mutations
})

注意:import的vue和vuex一定要是小写,state,mutations都是固定写法,其中mutations就类似methods,state就类似data.


新建Count.vue文件
<template>
    <div>
        <h2>{{msg}}</h2>
        <h2>{{ $store.state.count }}</h2>
         <button @click="$store.commit('add')">+</button>
        <button @click="$store.commit('reduce')">-</button>
    </div>
</template>
<script>
    import store from '@/vuex/store';
    export default{
        data(){
            return{
                msg:"Hello Count!"
            }
        },
        store,
    }
</script>
注意:一定要导入store文件,同时在script中添加store。
使用方法利用,commit()
$store.commit('reduce')

state:状态对象

在模板文件中直接{{msg}}这样使用state的属性值

方式一:computed

在要使用该state属性的模板文件中,
利用computed计算方法
computed:{
    count(){
        return this.$store.state.count;
    }
}
注意:return时候前面加上this。

方式二:mapState

在模板文件中导入
import {mapState} from 'vuex';
注意一定要给mapState加上{}.
然后:
computed:mapState({
    count:state=>state.count
})

方式三(常用方式)

computed:mapState(['count'])

mutations:改变状态对象值的方法

传递参数:
add(state,n){
        state.count+=n;
},
 <button @click="$store.commit('add',10)">+</button>

简化click的书写:
<button @click="reduce">-</button>
import {mapState,mapMutations} from 'vuex';
methods:mapMutations(['reduce'])

完整案例:
<template>
    <div>
        <h2>{{msg}}</h2>
        <h2>{{ $store.state.count }} --{{count}}</h2>
         <button @click="$store.commit('add',10)">+</button>
        <button @click="reduce">-</button>
    </div>
</template>
<script>
    import store from '@/vuex/store';
    import {mapState,mapMutations} from 'vuex';
    export default{
        data(){
            return{
                msg:"Hello Count!"
            }
        },
        store,
        computed:mapState(['count']),
        methods:mapMutations(['reduce'])
    }
</script>
其他文件不变。

getters计算过滤操作

...是扩展运算符

store.js文件中:
const getters={
    count(state){
        return state.count+=100;
    }
}
然后把store对外:
export default new Vuex.Store({
    state,mutations,getters
})


Count.vue文件中:
import {mapState,mapMutations, mapGetters} from 'vuex';
computed:{
    ...mapState(['count']),
    // count(){
//returnthis.$store.getters.count;
            // }
        ...mapGetters(['count'])
}

说明:注释的写法和...mapGetters(['count'])是等效的,而且不需要导入
mapGetters,但是...mapGetters(['count'])才是最常用写法。
补充:...扩展函数时候,是针对之前函数返回多个值的解决方案,之前函
数返回多个值,要封装成数组或者对象,本质还是一个值。...扩展函数返
回可以是多个值,此时例如...mapSate(['count'])如果只有这一个条目省
略...也可行,但是可能还有...mapState(['number'])等等其他变量的计算属
性,所以针对mapState函数其实是返回了多个值,才需要...进行扩展

actions异步修改状态

mutations是同步修改

store.js文件中:
const actions={
    addAction(context){
        context.commit('add',10)
    },
    reduceAction({commit}){
        commit('reduce')
    }
}
说明:action是可以直接使用mutations中的方法的,上面就是两种方式,注意context和{commit}作为参数的区别。

Count.vue文件中:
methods:{
    ...mapMutations(['reduce']),
    ...mapActions(['addAction','reduceAction'])
}



module模块组(不常用)

随着项目的复杂性增加,我们共享的状态越来越多,这时候我们就需要把我们状态的各种操作进行一个分组,分组后再进行按组编写。

声明模块组:
在vuex/store.js中声明模块组,我们还是用我们的const常量的方法声明模块组。代码如下:
const moduleA={
    state,mutations,getters,actions
}
const moduleA={
    state,mutations,getters,actions
}
声明好后,我们需要修改原来 Vuex.Stroe里的值:


export default new Vuex.Store({
    modules:{a:moduleA}
})

export default new Vuex.Store({
    modules:{a:moduleA}
})
在模板中使用
现在我们要在模板中使用count状态,要用插值的形式写入。

<h3>{{$store.state.a.count}}</h3>
<h3>{{$store.state.a.count}}</h3>
如果想用简单的方法引入,还是要在我们的计算属性中rutrun我们的状态。写法如下:


computed:{
    count(){
        return this.$store.state.a.count;
    }
},

computed:{
    count(){
        return this.$store.state.a.count;
    }
},


上一篇 下一篇

猜你喜欢

热点阅读