Vue Vuex Action

发布于 2024-12-03 15:14:34 字数 3209 浏览 5 评论 0

Action 类似于 mutation,不同在于:

  • Action 提交的是 mutation,而不是直接变更状态。
  • Action 可以包含任意异步操作。

Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。

const store = new Vuex.store({
    state:{
        count:0
    },
    mutations:{
        increment(state){
            state.count++
        }
    },
    actions:{
        increment(context){
            context.commit('increment')
        }
        deduce({ commit }){
            commit('increment')
        }
    }
})

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

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

actions: {
    checkout({ commit, state }, products){
        // 把当前购物车的物品备份起来
        const savedCartItems = [...state.cart.added]
        // 发出结账请求,然后乐观地清空购物车
        commit(types.CHECKOUT_REQUEST) 
    }
}

在组件中分发 action

  • 使用 this.$store.dispatch('xxx') 分发 action
  • 使用 mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用(需要先在根节点注入 store)
<script>
    methods:{
        ...mapActions([
            // 将'this.increment()' 映射为 'this.$store.dispatch('increment')'
            'increment', 
            // 'mapMutations' 也支持载荷
// 将'this.incrementBy(amount)' 映射为'this.$store.dispatch('incrementBy',amount)'
            'incrementBy'
        ]),
        ...mapActions({
            // 将'this.add()' 映射为 'this.$store.commit('increment')'
            add:'increment'
        })
    }
</script>

组合 Action

  • store.dispatch 可以处理被触发的 action 的处理函数返回的 Promise,并且 store.dispatch 仍旧返回 Promise:
    <script>
        actions:{
            actionA({ commit }){
                return new Promise((resolve, reject)=>{
                    setTimeout(()=>{
                        commit('someMutation')
                        resolve()
                    },1000)
                })
            }
        }
    
        store.dispatch('actionA').then(()=>{
            // ...
        })
    </script>
    
  • 在 action 中分发 action:
    <script>
        actions:{
            actionB({ dispatch, commit}){
                return dispatch('actionA').then(()=>{
                    commit('someOtherMutation')
                })
            }
        }
    </script>
    

利用 async / await ,我们可以如下组合 action,一个 store.dispatch 在不同模块中可以触发多个 action 函数。在这种情况下,只有当所有触发函数完成后,返回的 Promise 才会执行:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

甜中书

暂无简介

0 文章
0 评论
25 人气
更多

推荐作者

爱人如己

文章 0 评论 0

萧瑟寒风

文章 0 评论 0

云雾

文章 0 评论 0

倒带

文章 0 评论 0

浮世清欢

文章 0 评论 0

撩起发的微风

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文