美文网首页
vuex Action

vuex Action

作者: 小冕 | 来源:发表于2017-12-11 09:28 被阅读0次

Action

Action类似于mutation,不同在于:

  • Action提交的是mutation,而不是直接变更状态。
  • Action可以包含任意一步操作。
    让我们来注册一个简单的action:
const store = new Vuex.store({
  state :{
    count:0
  },
  mutations:{
    increment(state){
      state.count++
    }
  },
  actions:{
    increment(context){
      context.commit('increment')
    }
  }
})

Action 函数接受一个与store实例具有相同方法和属性的context对象,因此你可以调用context.commit提交一个mutation,或者通过context.state和context.getters来获取state和getters。当我们在之后介绍到Modules时,你就知道context对象为什么不是store实例本身了。
实践中,我们会经常用到ES2015的参数解构来简化代码(特别是我们需要调用commit很多次的时候):

actions:{
  increment({commit}){
    commit('increment')
  }
}

分发Action

Action通过store.dispatch方法触发

store.dispatch('increment')

看上去感觉多此一举。我们直接分发mutation岂不更方便?实际上并非如此,还记得mutation必须同步执行这个限制么?Action就不受约束!我们可以在action内部执行异步操作:

actions:{
  incrementAsync({commit}){
    setTimeout(()=>{
      commit('increment')
    },1000)  
  }
}

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

//以载荷形式分发
store.dispath('incrementAsync',{
  amount:10
})
//以对象形式分发
store.dispatch({
  type:'incrementAsync',
  amount:10
})

来看一个更加实际的购物车示例,涉及到调用异步API和分发多重mutation:

actions:{
  checkout ({commit,state},products){
  //把当前购物车的物品备份起来
const savedCardtItems=[...state.cart.added]
  //发出结账请求,然后乐观地清空购物车
commit (types.CHECKOUT_REQUEST)
//购物API接受一个成功回调和一个失败回调
shop.buyProducts(
products,
//成功操作
()=>commit(types.CHECKOUT_SUCCESS),
//失败操作
()=>commit(types.CHECKOUT_FAILURE,savedCartItems)  
)
  }
}

*注意我们正在进行一系列的异步操作,并且通过提交mutation来记录action产生的副作用(即状态变更)。

在组件中分发Action

你在组件中使用this.$store.dispatch('xxx')分发action,或者使用mapActions辅助函数将组件的methods映射为store.dispatch调用(需要先在根节点注入store):

import {mapActions} from 'vuex'
export default {
  //...
  methods:{
    ...mapActions([
        'increment',//将`this.increment()`映射为`this.$store.dispatch('increment')`
          //'mapActions'也支持载荷:
        'incrementBy' //将`this.incrementBy(amount)`映射为`this.$store.dispatch('incrementBy',amount)`
      ]),
      ...mapActions({
        add:'increment' //将`this.add()`映射为`this.$store.dispatch('increment')`
    })
  }
}

组合Action
Action通常是异步的,那么如何知道action什么时候结束呢?更重要的是,我们如何才能组合多个action,以处理更加复杂的异步流程?
首先,你需要明白store.dispatch可以处理被触发的action的处理函数返回的promise,并且store.dispatch仍旧返回Promise:

actions:{
  actionA({commit}){
    return new Promise((resolve,reject)=>{
      setTimeout(()=>{
        commit('someMutation')
        resolve()
      },1000)
    })
  }
}

现在你可以:

store.dispatch('actionA').then(()=>{
  //... 
})

在另外一个action中也可以:

actions:{
    //...
  actionB({dispatch,commit}){
     return dispatch('actionA'.then()=>{
        commit('someOtherMutation')
      })
  }
}

最后,如果我们利用async/await,我们可以如下组合action:

//假设getData()和getOtherData()返回的是Promise
actions:{
  async actionA ({commit}){
    commit('gotData',await getData())
  },
async actionB({dispatch,commit}){
   await dispatch ('actionA')//等待actionA完成
  commit('gotOtherData',await getOtherData())
} 
}

一个store.dispatch在不同模块中可以触发多个action函数。在这种情况下,只有当所有触发函数完成后,返回的Promise才会执行。
本文来自vuex 官网

相关文章

  • 微前端quankun Vue应用 action+Vuex通信方式

    action + Vuex 通信主要是使用官方的 action 进行通信,之后再将值更新到 vuex 中 主应用 ...

  • vuex Action

    Action Action类似于mutation,不同在于: Action提交的是mutation,而不是直接变更...

  • 快速入门Vuex 魔法

    Vuex核心 Store State Mutation Action Module Vuex 的工作流程图 下面我...

  • 使用Vuex,modules的命名空间 报错 unknown a

    使用Vuex 报错 unknown action type:XXX(未知的操作类型: Vuex命名空间的报错 h...

  • vuex辅助函数的使用

    vuex是vue的公共状态管理,vuex核心的概念有五个,state,mutation,action,getter...

  • vuex

    如图是vuex的模块结构 使用vuex app.js触发模块action中的toggleSideBar方法: 用户...

  • 6--Vuex

    Vuex(状态管理模式) Vuex 的核心由五部分组成:State、Getter、Mutation、Action ...

  • Vuex有那几种状态和属性?

    vuex的流程 页面通过mapAction异步提交事件到action。action通过commit把对应参数同步提...

  • Vuex之Action

    Action为mutation服务,因为Action可以包含任意异步操作。 分发Action Actions 支持...

  • vuex-Action

    在 mutation 中混合异步调用会导致你的程序很难调试。例如,当你调用了两个包含异步回调的 mutation ...

网友评论

      本文标题:vuex Action

      本文链接:https://www.haomeiwen.com/subject/bzisixtx.html