在商店中,我有一个更新一些数据的操作,该操作如下所示:
setRoomImage({ state }, { room, index, subIndex, image }) {
state.fullReport.rooms[room].items[index].items[subIndex].image = image;
console.log(state.fullReport.rooms[room].items[index].items[subIndex])
},
因为所有这些数据都是动态的,所以我必须动态更改嵌套值并且不能直接对属性进行硬编码。数据如下所示:
fullreport: {
rooms: {
abc: {
items: [
{
type: "image-only",
items: [
{
label: "Main Image 1",
image: ""
},
{
label: "Main Image 2",
image: ""
}
]
}
]
}
}
}
当我分派动作时,在控制台中我可以看到子属性的值image已成功改变,但是如果我从 Chrome 中的 Vue DevTools 访问 VueX 存储,我看到该值在那里没有改变。这是控制台输出:
拜托,有人能告诉为什么会这样吗?据我所知,数据正在成功更改,但不知何故状态没有显示它,因此我的组件不会重新渲染。
我也尝试使用Vue.set而不是简单的赋值,但仍然没有运气:(
Vue.set(
state.fullReport.rooms[room].items[index].items[subIndex],
"image",
image
);
编辑:
按照David Gard 的回答,我尝试了以下操作:
我也在使用 Lodash _(我知道制作对象的整个副本不好),这是变异代码块。
let fullReportCopy = _.cloneDeep(state.fullReport);
fullReportCopy.rooms[room].items[index].items[subIndex].image = image;
Vue.set(state, "fullReport", fullReportCopy);
现在在计算属性中,它state.fullReport是一个依赖项,我有一个console.log只要重新计算计算属性就会打印出一个字符串。
每次我提交这个变更时,我都会看到计算属性记录字符串,但它接收的状态仍然没有改变,我猜Vue.set只是告诉计算属性状态改变了,但它实际上并没有改变它。因此,我的组件的 UI 没有变化。
Helenr
相关分类