【发布时间】:2020-08-13 16:11:33
【问题描述】:
我在这里和其他地方已经阅读了多个类似的问题,但我无法弄清楚。
我有一个带有 mapGetters 的表单和应该根据 Vuex 状态更新的输入值:
...mapGetters({
show: "getShow"
}),
示例表单输入(我使用的是 Bootstrap Vue):
<b-form-input
id="runtime"
name="runtime"
type="text"
size="sm"
v-model="show.runtime"
placeholder="Runtime"
></b-form-input>
那我在表单组件上有这个方法:
async searchOnDB() {
var showId = this.show.showId;
if (!showId) {
alert("Please enter a showId");
return;
}
try {
await this.$store.dispatch("searchShowOnDB", showId);
} catch (ex) {
console.log(ex);
alert("error searching on DB");
}
},
以及对商店的此操作:
async searchShowOnDB({ commit, rootState }, showId) {
var response = await SearchAPI.searchShowOnDB(showId);
var show = {
show_start: response.data.data.first_aired,
runtime: response.data.data.runtime,
description: response.data.data.overview
};
//I'm updating the object since it could already contain something
var new_show = Object.assign(rootState.shows.show, show);
commit("setShow", new_show);
}
变异:
setShow(state, show) {
Vue.set(state, "show", show);
}
搜索API:
export default {
searchShowOnDB: function (showId) {
return axios.get('/search/?id=' + showId);
},
}
一切正常,API 调用被执行,我什至可以在 Vue Devtools 中看到 Vuex 更新状态,但表单没有更新。
只要我在输入字段中写入内容或在 Vue Devtools 中点击 commit,表单字段 show_start、runtime、description 都会更新。
此外,这可以正常工作并更新所有内容:
async searchShowOnDB({ commit, rootState }, showId) {
var show = {
show_start: "2010-03-12",
runtime: 60,
description: "something"
};
//I'm updating the object since it could already contain something
var new_show = Object.assign(rootState.shows.show, show);
commit("setShow", new_show);
}
我不知道还能做什么,我尝试明确解决 Promises,删除 async/await 并使用 axios.get(...).then(...),移动一些东西......似乎没有任何效果。
【问题讨论】:
-
也许可以尝试复制该问题,但请以较小的规模与我们分享:) 通过 CodeSandbox 或 JSFiddle
-
我在这里复制了它:codesandbox.io/s/brave-sun-yjl36 - 新窗口:yjl36.csb.app - 只需输入名称并点击搜索。什么都不会改变。那么一旦你编辑输入,我需要的就会出现。
标签: javascript vue.js async-await vuex