vuex怎样写actions异步修改状态

2025-11-05 13:34:35

1、第一步 在你建立vuex的store.js中声明actions方法

import Vue from 'vue'

import Vuex from 'vuex'

Vue.use(Vuex)

const state={//状态对象

count1:1,

},

const mutations={//触发状态

  jia(state,n){

        state.count1+=n;

    },

 jian(state){

        state.count1--;

    },

},

const actions={

jiaAction(context){

context.commit('jia',10)

/*这句话就是说,我现在store调用了同步的方法jia()*/

},

jianAction({commit}){

commit('jian')/*这句话就是说,我现在store调用了同步的方法jian()*/

}

}

export default new Vuex.Store({

state,

mutations,

getters,

actions/*这与state,mutations的操作方法是相同*/

})

2、第二步 在你的模板(比如a.vue)里引入你需要actions方法

1)import引入mapActions

 import {mapState,mapMutations,mapGetters,mapActions} from 'vuex'

2)在你的方法中引入   ...mapActions(['jiaAction','jianAction'])

格式一般都是固定照抄即可

代码如下:

<template>

<div>

<div>

{{count1}}

</div>

</div>

</template>

<script>

    import store from '@/store'

    import {mapState,mapMutations,mapGetters,mapActions} from 'vuex'

    export default{

        data(){

            return{

             

            }

        },

    

  methods:{

    ...mapMutations([  

        'jia','jian'

    ]),

    ...mapActions(['jiaAction','jianAction'])

}, 

     computed:{

     

     

     ...mapState(["count1"]),

  

     },

       

        store

        

    }

</script>

<style scoped>

.color{

color:red;

}

</style>

3、第三步在你的组件的模板(a.vue)里引入点击事件

代码如下:

<template>

<div>

<div>

{{count1}}

</div>

  <button @click="jiaAction">+</button>

  <button @click="jianAction">-</button>

</div>

</template>

整体代码如下:

<template>

<div>

<div>

{{count1}}

</div>

  <button @click="jiaAction">+</button>

  <button @click="jianAction">-</button>

</div>

</template>

<script>

    import store from '@/store'

    import {mapState,mapMutations,mapGetters,mapActions} from 'vuex'

    export default{

        data(){

            return{

             

            }

        },

    

  methods:{

    ...mapMutations([  

        'jia','jian'

    ]),

    ...mapActions(['jiaAction','jianAction'])

}, 

     computed:{

     

     

     ...mapState(["count1"]),

  

     },

       

        store

        

    }

</script>

注:现在你点击你的+或-的按钮,观察它的值与你把

<button @click="jiaAction">+</button>

  <button @click="jianAction">-</button>

换成

<button @click="jia">+</button>

  <button @click="jian">-</button>

有何不同?

没有区别说明你调试代码成功

4、第四步 进行异步验证

我们在我们的store.js中的jiaAction加入jiaAction方法

setTimeout(()=>{

context.commit('jian')

},3000)

console.log('我先被执行');

你再观察结果,你会发现jian这个方法在3s之后执行,你点jia依然可以在3s之内先执行,这就是异步修改状态与同步的区别。

整体代码如下:

a.vue部分

<template>

<div>

<div>

{{count1}}

</div>

  <button @click="jiaAction">+</button>

  <button @click="jianAction">-</button>

</div>

</template>

整体代码如下:

<template>

<div>

<div>

{{count1}}

</div>

  <button @click="jiaAction">+</button>

  <button @click="jianAction">-</button>

</div>

</template>

<script>

    import store from '@/store'

    import {mapState,mapMutations,mapGetters,mapActions} from 'vuex'

    export default{

        data(){

            return{

             

            }

        },

    

  methods:{

    ...mapMutations([  

        'jia','jian'

    ]),

    ...mapActions(['jiaAction','jianAction'])

}, 

     computed:{

     

     

     ...mapState(["count1"]),

  

     },

       

        store

        

    }

</script>

store.js部分

import Vue from 'vue'

import Vuex from 'vuex'

Vue.use(Vuex)

const state={//状态对象

count1:1,

},

const mutations={//触发状态

  jia(state,n){

        state.count1+=n;

    },

 jian(state){

        state.count1--;

    },

},

const actions={

jiaAction(context){

setTimeout(()=>{

context.commit('jian')

},3000)

console.log('我先被执行');

context.commit('jia',10)

/*这句话就是说,我现在store调用了同步的方法jia()*/

},

jianAction({commit}){

commit('jian')/*这句话就是说,我现在store调用了同步的方法jian()*/

}

}

export default new Vuex.Store({

state,

mutations,

getters,

actions/*这与state,mutations的操作方法是相同*/

})

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢