第五节:Actions

actions异步修改状态

actions和mutations是类似的,不同之处在于:

  • Action提交的是Mutation,不能够直接修改state中的状态,而Mutations是可以直接修改state中状态的;
  • Action是支持异步操作的,而Mutations只能是同步操作。

还是通过代码来理解吧

1、在store.js中定义一个常量actions,如下:

const mutations = {
    //注册事件  type:add  回调第一个参数是state
    add(state,val){
        state.count++
    },
    reduce(state, val){
        state.count --
    }
}

const actions = {
    //这里的actionAdd是组件中和所触发的事件相对应的方法
    actionAdd(context){
        context.commit('add')//这里的add是mutations中的方法
    },
    //这里是通过参数结构来简化代码。
    actionReduce( { commit } ){
        commit('reduce')
    }
}

Actions接受一个context对象参数,该参数具有和store实例相同的属性和方法,所以我们可以通过context.commit()提交mutations中的方法,或者可以通过context.state和context.getters去获取state和getters。

  • context作为上下文对象,可以简单的理解成store实例,有共享store实例的属性和方法的权利,但是切记:context并不是store实例本身。

  • { commit } 这里直接把commit为属性的对象传过来,可以让代码简单明了。

2、同样的,我们需要将actions导出去

export defualt new Vuex.Store({
    state, mutations, actions
})

3、分发action:在组件中可以通过this.$store.dispatch分发action,或者使用mapActions辅助函数将methods映射为store.dispatch调用。

Action 通过 store.dispatch 方法触发


    add(){
        this.$store.dispatch('actionAdd')
    },
    reduce(){
        this.$store.dispatch('actionReduce')
    }
        

Actions支持同样的载荷方式和对象进行分发:

    add(){
        this.$store.dispatch('actionAdd', {
            num: 20
        })
    },
    reduce(){
        this.$store.dispatch(
            {type:'actionReduce', num : 10}
        )
    }

在actions里对应的方法中第二个参数接受分发是传递的值。

使用mapActions辅助函数

<button @click = 'actionAdd'>+</button>
<button @click = 'actionReduce'>-</button>

//同样需要导入mapActions辅助函数
import { mapState, mapMutations, mapActions } from 'vuex'

methods: {

    //如果名字不同,使用mapActions辅助函数的对象参数
    //...mapActions( { add: 'actionAdd', reduce: 'actionReduce'} )

    //当action中的函数名和组件节点的方法名相同的时候,使用mapActions辅助函数的数组参数
    ...mapActions( ['actionAdd', 'actionReduce'] )

}

如果觉得以上不好理解,看下面代码,哈哈,这是写笔记的过程中尝试出来的(纯属瞎玩,正真开发是不带这么干的)。

//组件通过触发事件去调用actions中的方法,进而调用mutations中的方法
    add(){
            console.log(this.$store._actions)
            this.$store._actions.actionAdd[0]()
    },
    reduce(){
            this.$store._actions.actionReduce[0]()
    }

为什么要这样做,我们先把store打印出来看看里边究竟是什么鬼便一目了然:

然后我们_action展开:

发现_action对象的两个属性就是我们在store.js的actions里定义的两个函数,值是分别是一个长度为1的数组。所以我们可以通过下面的这种方法也可以触发action中的方法,进而触发mutations中的方法。

这种方式仅仅是为了理解它是怎么一回事,在真正的开发中是不能这样做的,且不说代码乱,更重要的显示不专业啊。_

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 安装 npm npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.u...
    萧玄辞阅读 3,050评论 0 7
  • vuex 场景重现:一个用户在注册页面注册了手机号码,跳转到登录页面也想拿到这个手机号码,你可以通过vue的组件化...
    sunny519111阅读 8,165评论 4 111
  • Vuex 是什么? ** 官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式**。它采用集中...
    Rz______阅读 2,360评论 1 10
  • 上一章总结了 Vuex 的框架原理,这一章我们将从 Vuex 的入口文件开始,分步骤阅读和解析源码。由于 Vuex...
    你的肖同学阅读 1,895评论 3 16
  • Vuex 的学习记录 资料参考网址Vuex中文官网Vuex项目结构示例 -- 购物车Vuex 通俗版教程Nuxt....
    流云012阅读 1,543评论 0 7

友情链接更多精彩内容