将vuex存储的一部分作为动作的负载进行分发是否正确?

时间:2018-09-01 11:30:22

标签: vue.js vuex flux

我对这家vuex商店有疑问

export default {
    state: {
        resultSet: [
            {
                name: "result 1"
                deep: {
                    inside: {
                        isLoading: false
                    }
                }
            },
            {
                name: "result 2"
                deep: {
                    inside: {
                        isLoading: false
                    }
                }
            },
        ]
    },
    actions: {
        /*
        r is an item of the resultSet in the store (so r is a part of the store)
        */
        sendQuery(context, r) {
            //Here I mutate r directly (it means that I mutated the store directly without commit a mutation)

            r.deep.inside.isLoading = true;

            //Everything work, the UI is updated along with the state changes, but I'm not sure that 
            //I'm doing the right thing (mutate the store indirectly without committing a mutation)
        }
    }
}

问题:

  1. 将商店的一部分作为动作的负载分发是正确的吗? =>该动作可能直接更改r的状态。

  2. 在上述操作中对r.deep.inside.isLoading=true进行突变是否正确?

1 个答案:

答案 0 :(得分:3)

  
      
  1. 将商店的一部分作为动作的负载分发是否正确? =>该动作可能直接更改r的状态。
  2.   

状态可以在有效负载中很好。但是动作不能直接修改状态。

  
      
  1. 在上述操作中对r.deep.inside.isLoading=true进行突变是否正确?
  2.   

不。来自docs

  

动作不是突变状态,而是突变。

动作只能 commit 突变(类似于Vuex中的“事件总线”和/或互斥体)。

动作(类似于事件本身)分发其他类似事件的东西似乎很愚蠢,但是变异事件(“提交”)具有特殊的规则,例如they must be synchronous,而动作可以执行异步进行突变之前的任务。

在开发过程中利用strict mode的优势,当您错误地修改状态时,Vuex肯定会通知您。