vuex常用法

stores.js里

export default new Vuex.Store({
    state: {
        myStateArr:[
            {id:1,age:24,name:'lin'},
            {id:2,age:25,name:'qi'}
        ],
        myStateNum:1
    },
    mutations: {
        //第一个就是store.state,第二个是外部传进来的参数(可选)
        increment (state,params) {
            state.myStateNum += params
        }
    },
    //context具有store相同的方法和属性,params传进来的参数
    //myAction({commit,state,getters},params)
    //actions可以使用异步分发mutations
    actions: {
        myAction(context,params){
            //可以将传进来的参数在传给mutations(可选)
            context.commit('increment',params)
        }
    },
    //personLen(state [,getters])
    // getters一般有两以下两种用法,第一种只需要获取内容的,第二种是根据传进来的参数来获取内容的
    getters:{
        myGetter(state){
            return  state.myStateNum;
        },
        myGetterTwo:(state) => (id) => {
            return state.myStateArr.filter(function (value) {
               if( value.id == id){
                   return value
               }
            })
        }
    }
})

在其它地方调用

state and getters

这两个都是获取状态的,使用方法差不多,getters可以根据传递的参数来获取

import {mapState,mapGetters} from 'vuex'
computed:{
    ...mapState({
        myStateArr: 'myStateArr'
    }),
    ...mapGetters({
        //将this.myGetter 映射为 this.$store.getters.myGetter
        myGetter:'myGetter',
        myGetterTwo:'myGetterTwo'
    })
}

mutations and actions

这两个都是方法,mutation只能用于同步,actions可用于异步

 

methods:{
    change(){
        this.increment(3)
    },
    changeTwo(){
        this.add(2)
    },
    ...mapMutations({
        //相当于this.$store.commit('increment')
        increment:'increment'
    }),
    ...mapActions({
        //将this.add()映射为this.$store.dispatch('myAction');
        add:'myAction'
    })
}

小结

1. 上面的increment:'increment'这种键值对相同的可以使用mapMutations(['increment'])这种方式。
2. state,getter都是状态,用计算属性获取值;mutations,actions里的都是方法,其它方法怎么用,这个也怎么用;
3. 增加state要用到vue.set(obj,kes,value);
 

modules

项目大的时候会用到,建不同的js,形如:

const login = {
    state:{
        name:'222'
    }
    //...
};

export default {
    login
}

然后在store.js中引入

import login from './zz'

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

modules中,只有state不在全局命名空间(简单说就是在同一个模块中的mutaions,getters,actions可以访问到)。getters,mutations,actions在全局命名空间,和不是模块的一样形式使用。还有rootState,rootGetters,

const moduleA = {
    state:{
        age:22
    },
    mutations:{
        //increment(state [,params] [,rootState] [,rootGetters])
        increment(state){
            state.age++
        }
    },
    getters:{
        //myGetter(state [,getters] [,rootState])
        myGetter(state){
            return state.age
        }
    },
    actions:{
        //ccontext.state context.rootState ...
        myAction({commit,state,rootState}){
            commit('increment')
        }
    }
};

使用如下:

methods:{
    changeOne(){
        this.increment()
    },
    changeTwo(){
        this.myAction();
    },
    ...mapMutations({
        increment:'increment'
    }),
    ...mapActions({
        myAction:'myAction'
    })
},
computed:{
    ...mapState({
        msg:state => state.a.age,
        msgTwo:state => state.b.age
    }),
    ...mapGetters({
        myGetter:'myGetter'
    })
}

上面触发了‘myGetter’,‘myAction’,在任意模块中有同名的都会触发,为了能够制定触发某个模块下的getters,mutations,actions,就要使用命名空间了;

const login = {
    namespace:true,
    state:{
        name:'222'
    }
    //...
};

export default {
    login
}

加了命名空间后,就要如下面这样使用了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值