【发布时间】:2020-01-14 08:28:10
【问题描述】:
在商店中,我有一个动作来更新一些数据,动作如下所示:
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 存储,我看到该值没有t在那里改变。这是控制台输出:
拜托,有人能说出为什么会这样吗?据我所知,数据正在成功更改,但不知何故状态没有显示它,因此我的组件不会重新呈现。
我也尝试使用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 没有任何变化。
【问题讨论】:
-
顺便说一句:您应该避免在商店中放置如此大的嵌套对象。见forum.vuejs.org/t/vuex-best-practices-for-complex-objects/10143/…
-
实际上在你的行动中你应该提交一些突变来做到这一点
-
@MatheusValenza 会解决当前的问题还是只是遵循惯例?
-
@NadirAbbas 操作不会更新状态。突变确实如此。可能你会收到一些警告。见vuex.vuejs.org
-
你尝试过 Vue.set 而不是简单的 assign 吗?
标签: javascript vue.js vuex