5、Action

目录

介绍

本文是学习vuex时做的笔记,所有笔记内容请看 vuex学习笔记

Action

Action 类似于 mutation,不同在于:

  • Action 提交的是mutation,而不是直接变更状态
  • 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。
使用ES2015 的参数解构来简化代码,如下所示

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

分发Action
Action通过store.dispacth()方法触发:

store.dispath('increment')

在actions中可以执行异步操作:

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

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

// 以载荷形式分发
store.dispacth('incrementAsync',{
    amount:10
})

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

涉及调用异步API和分发多重mutation:

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

在组件中分发Action

import { mapActions} from 'vuex'
exort default{
    //..
    methods:{
        ...mapActions({
      // 将this.increment() 映射为this.$store.dispatch('increment') 
          'increment',
      // 将this.incrementBy(amount)映射为this.$store.dispatch('incrementBy',amount) 
         'incrementBy'  
        }),
        ...mapActions({
     // 将this.add() 映射为 'this.$store.dispatch('increment')'      
            add:'increment'
        })
    }
}

组合Action
store.dispatch()可以处理被触发的action的处理函数返回的Promise,并且store.dispatch 仍旧返回Promise:

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

调用方法:

// 直接调用
store.dispatch('actionA').then(()=>{
    // actionA中异步函数执行成功后
})

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,cmomit}){
        await dispatch('actionA')// 等待actionA完成
        commit('getOtherData',await getOtherData())
    }
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我没有找到关于"Spring in Action5 chm"的引用内容。但是,我可以告诉你《Spring in Action》是一本关于使用Spring框架的书籍,它介绍了Spring框架的各个方面,包括核心概念、IoC容器、AOP、数据访问、Web开发等等。这本书可以帮助你深入理解和应用Spring框架。如果你需要更详细的信息,我建议你阅读这本书。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Spring数据绑定](https://blog.csdn.net/weixin_45968443/article/details/117466448)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Spring学习5——AOP](https://blog.csdn.net/doubleview/article/details/115872366)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [SpringInAction第九章学习笔记:Spring Security](https://blog.csdn.net/cairuojin/article/details/89520822)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值