Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript .推端´;s在“中”;不要在变异处理程序之外变异vuex存储状态”;_Javascript_Vuejs2_Store_Vuex - Fatal编程技术网

Javascript .推端´;s在“中”;不要在变异处理程序之外变异vuex存储状态”;

Javascript .推端´;s在“中”;不要在变异处理程序之外变异vuex存储状态”;,javascript,vuejs2,store,vuex,Javascript,Vuejs2,Store,Vuex,我定义了一个Vuex存储区,其中包含(操作、状态、突变和getter) 当我将新的todo添加到我的状态数组中时,出现以下错误: 错误:[vuex]不要在变异处理程序之外变异vuex存储状态 const state = { todos: [] } export default { ADD_TODO (state, payload) { state.todos.push(payload.todo) } } 无法使用状态为的数组吗 我还尝试使用一个适用于todos状态的对象,

我定义了一个Vuex存储区,其中包含(操作、状态、突变和getter)

当我将新的todo添加到我的状态数组中时,出现以下错误: 错误:[vuex]不要在变异处理程序之外变异vuex存储状态

const state = {
  todos: []
}

export default {
  ADD_TODO (state, payload) {
    state.todos.push(payload.todo)
  }
}
无法使用状态为的数组吗


我还尝试使用一个适用于todos状态的对象,该对象工作正常。

您不能改变状态本身,必须为状态指定一个新值以改变状态,因此在您的情况下,您可以执行以下操作:

在组件中,将TODO从存储分配给变量,如

//COMPONENT
let todos = [...this.$store.todos] //or assign from a getter if you have one;
todos.push(newTodo);
addTodo(todos); //call mutation from component and pass your todos array as payload


//STORE
ADD_TODO (state, payload) {
  state.todos = payload;
}

例如,如果todo变量来自数据节,则可能是指针问题:

/** Component **/
data () {
  todo : {
    // whatever
  }
},
methods: {
  addTodo () {

    // Will add same todo reference to state list
    // which can cause “Do not mutate vuex store state outside mutation 
    // handlers” exception

   ADD_TODO({todo : this.$data.todo}) 

  }
},
在添加到列表之前,您可以像这样取消引用todo条目,而不是传递整个todo数组:

const _todo = Object.assign({}, todo)
ADD_TODO({todo : _todo}) // call store action

好的…赋值但是:state.todos=[…state.todos,payload.todo];不幸的是,抛出了相同的错误。