Vuex,在动作中改变状态

Posted

技术标签:

【中文标题】Vuex,在动作中改变状态【英文标题】:Vuex, changing state in an action 【发布时间】:2018-04-16 16:26:16 【问题描述】:

在学习 Vuex 时,我正在尝试尽可能地编写“良好实践”的代码。

据我所知,我认为 Actions 用于执行例如外部 API 调用,其结果通过 commit() 传递给 Mutation

现在我想为 Firebase 上的某个用户增加一个计数器。当我像这样编写我的操作时,这是有效的

    ADD_CREDIT(context, user) 

        user.credits++;

        firebase.database().ref('users').child(user.id)
            .update(credits: user.credits)
            .then(() => );

    

因此,在我的操作中,我已经在调用 API 调用之前更新了状态。这是好习惯吗?我使用以下代码尝试了另一种方式,但这看起来很复杂..而且它现在不起作用。

动作

ADD_CREDIT(commit, state, user) 

        const newcredits = user.credits + 1;

        firebase.database().ref('users').child(user.id)
            .update(credits: newcredits)
            .then(() => 
                commit('CREDIT_CHANGED', user.id, newcredits)
            );

    

变异

CREDIT_CHANGED(state, userid, newcredits) 
        let user = state.users.find(user => 
            return user.id = userid
        );

        user.credits = newcredits;
    

【问题讨论】:

【参考方案1】:

变异函数的模式是

function mutation(state, payload) 
...
// do something with state
state.person = payload;
...

它没有比那个 2 更多的参数了。

因此,您的突变应该传递一个包含您所有信息的对象。像这样:

CREDIT_CHANGED(state, payload) 
   let user = state.users.find(user => user.id === payload.userid);
   user.credits = payload.newcredits;

然后你的行动应该像这样提交:

ADD_CREDIT(commit, state, user) 

    const newcredits = user.credits + 1;

    firebase.database().ref('users').child(user.id)
        .update(credits: newcredits)
        .then(() => 
            commit('CREDIT_CHANGED', 
                 userid: user.id, 
                 newcredits: newcredits 
            )
        );


【讨论】:

非常感谢!我错过了重点!完美的答案。

以上是关于Vuex,在动作中改变状态的主要内容,如果未能解决你的问题,请参考以下文章

vuex的使用和理解

Vuex:如何正确调用动作?

不使用突变直接改变 Vuex 状态

在 nuxt 中出现此错误:[vuex] 不要在突变处理程序之外改变 vuex 存储状态

Vuex - '不要在突变处理程序之外改变 vuex 存储状态'

Vue,错误 [vuex] 不会在突变处理程序之外改变 vuex 存储状态