Jen*_*ell 3 javascript ajax vue.js vuex vue-reactivity
我将 Vue 与 Vuex 一起使用。在一种情况下,我使用 Ajax 来获取表示值。路上的某个地方,可能是在computed不再有反应。
在我的组件中:
props: [ 'x', 'y' ],
template: `
<div class="presentation">
{{ presentation }}
</div>
`,
computed: {
presentation() {
return this.$store.getters.presentation({ x: this.x, y: this.y });
}
}
Run Code Online (Sandbox Code Playgroud)
Vuex 商店:
const store = new Vuex.Store({
state: {
table: {
data: []
}
},
...
Run Code Online (Sandbox Code Playgroud)
Vuex 动作:
我用 ajax 调用一个 url 并返回一个承诺。我也犯了一个突变。
actions: {
save: (context) => {
let uri = 'some/uri';
let params = {};
let value = 'A value';
return axios
.post(uri, params)
.then((response) => {
context.commit('setPresentation', value);
})
.catch((error) => {
console.log('error');
})
.finally(() => {});
},
},
Run Code Online (Sandbox Code Playgroud)
Vuex 突变:
mutations: {
setPresentation: (state, value) => {
let pos = state.table.pos;
state.table.data[pos.y][pos.x].presentation = value;
},
}
Run Code Online (Sandbox Code Playgroud)
Vuex 获取器:
getters: {
presentation: (state) => (pos) => {
return state.table.data[pos.y][pos.x].presentation;
}
},
Run Code Online (Sandbox Code Playgroud)
我已经确定以下几点:
table.data为默认值以使其具有反应性笔记:
presentation多个组件。问题)
你需要使用Vue.set而不是state.table.data[pos.y][pos.x].presentation = value;
请参阅https://v2.vuejs.org/v2/guide/list.html#Caveats有关详细信息,
尝试使用以下代码更新您的突变:
if (!state.table.data[pos.y]) {
Vue.set(state.table.data, pos.y, [])
}
Vue.set(state.table.data[pos.y], pos.x, { presentation: value })
Run Code Online (Sandbox Code Playgroud)
我,OP(原海报)的一句话:
为什么第一次失败是因为我只设置了最后一部分,{ presentation: value }因为Vue.set我已经有了pos.y并且pos.x在另一个ajax调用中设置了。
为了让 Vue 充分了解更改是否需要设置状态中尚未设置的所有内容,请使用Vue.set. 所以我需要使用Vue.set来设置pos.y和pos.x也
另请参阅下面的另一个出色答案。
当您直接使用索引设置项目时,Vue 无法检测到数组的更改
| 归档时间: |
|
| 查看次数: |
388 次 |
| 最近记录: |