这几天我的头撞到了各种各样的墙上,希望能得到一些帮助。
我得到以下错误,但不能真正看到我所做的与vuex有什么关系:[vuex] do not mutate vuex store state outside mutation handlers.
在我的vue组件中,我为从外部API获得的未来数据定义了一个空数组。
data() {
return {
costCentres: [],
};
},
我有一个手表在我的vuex存储对象命名为schedule
(我已经使用MapState带来…并尝试使用一个getter使用MapGetter看看是否有任何不同)。在本文中,我创建了我的数组costCentres,其中每个元素由来自API的大约5个属性组成。我在这里添加了两个属性(章节和任务),我打算稍后填充它们,并且我需要响应,所以我按照Vue响应性文档这样做,我发现所有其他问题都像我的问题一样远程引用。
watch: {
schedule() {
if (this.schedule.rows) {
this.costCentres = this.schedule.rows.filter((row) => {
return row.cells[
this.schedule.columnKeysByName["Cost Code"]
].value; // returns row if Cost Code value exists
});
this.costCentres.forEach((costCentre) => {
this.$set(costCentre, 'section', null);
this.$set(costCentre, 'task', null);
});
}
},
this.$set
行对数组中的每个元素抛出前面提到的错误。
当我稍后更新属性时,更改是反应性的,所以只是大量的错误消息让我感到沮丧。显然,如果我不使用set
,那么我就不会得到反应性。
我不知道我所做的是如何与vuex存储相关的,因为costCentre
是一个普通的旧数据属性。
我已经尝试了数百种变化来获得这一切的工作(包括this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })
似乎不工作),我已经用完的选项,所以任何帮助将非常感激!
(也请让我知道如果我需要显示更多的代码-我试图保持简洁!)
this.schedule.rows
是一个包含一些对象的数组(从Vuex映射),所以数组和对象在"belongs"Vuex)- 您正在通过
filter
创建this.costCentres
-因此最终this.costCentres
只是另一个数组包含对象的子集从this.schedule.rows
(元素内部只是指针的对象Vuex) - 在
forEach
循环中,你正在修改的对象是Vuex存储的一部分,结果得到错误[vuex] do not mutate vuex store state outside mutation handlers.
如果您想修改这些对象,唯一的方法是使用Vuex mutations
另一种解决方案是复制对象(创建具有相同值的新对象):
this.costCentres = this.schedule.rows.filter((row) => {
return row.cells[this.schedule.columnKeysByName["Cost Code"]].value;
})
.map((row) => ({...row, section: null, task: null }))
注意:上面的代码只创建了一个浅拷贝,所以如果你的对象确实包含一些深嵌套的属性,你必须使用其他方法来克隆它们
现在this.costCentres
中的对象不是Vuex的一部分,可以自由修改而不使用突变…