我正在制造琐事制造商。我目前正在编辑页面上提问。名为EditQAForm的编辑组件将获取该特定问题的问题和答案,并填充其各自VueX商店的表单。
我目前在此页面的答案部分遇到麻烦。装入EditQAForm时,它将调用fetchQuestionAnswers,该操作将检索该特定问题的所有答案。它可以正确执行此操作,但是当我尝试在页面上显示任何答案时,尽管我在Vue DevTools中看到表单不为空,但它表示该表单为空。
(请注意,我删除了与此无关的内容。因此,假设您看到的所有方法确实存在)
以下是EditQAForm的安装位置:
mounted() {
//gets the params from the url
this.routeParams = this.$route.params;
//gets the answers that belong to this question
this.fetchQuestionAnswers(this.routeParams.question_id);
//not important for this problem
//get the question that needs to be edited
this.fetchQuestion(this.routeParams.question_id);
},
我如何在EditQAForm的计算属性中调用它:
computed: {
...mapGetters('question', ['formQuestionRoundID', 'questions', 'questionFields']),
...mapGetters('answer', ['answerFields', 'answers']),
//Questions
questionForm: {
get() {
return this.questionFields;
},
},
//Answers
answerForm: {
get() {
return this.answerFields;
},
},
}
这是答案的商店
function initialState() {
return {
answers: [],
answer: null,
form: [
{
id: '',
title: '',
question_id: '',
round_id: '',
correct: false,
},
{
id: '',
title: '',
question_id: '',
round_id: '',
correct: false,
},
{
id: '',
title: '',
question_id: '',
round_id: '',
correct: false,
},
]
}
}
const getters = {
answers(state){
return state.answers;
},
answerFields(state){
return state.form;
},
loading(state){
return state.loading;
},
};
const actions = {
fetchQuestionAnswers({ commit, state }, question_id) {
console.log("Form outside axios:");
console.log(state.form);
commit('setLoading', true);
axios.get('/api/question/' + question_id + '/answers')
.then(response => {
commit('SET_ANSWERS_FORM', response.data);
commit('setLoading', false);
}).catch( error => {
console.log(error.response);
});
},
const mutations = {
SET_ANSWERS_FORM(state, answers){
for(let $i = 0; $i < answers.length; $i++)
{
state.form[$i] = {
id: answers[$i].id,
title: answers[$i].title,
question_id: answers[$i].question_id,
round_id: answers[$i].round_id,
correct: answers[$i].correct,
}
}
// state.answers = answers;
},
UPDATE_TITLE(state, payload){
state.form[payload.order].title = payload.title;
},
UPDATE_QUESTION_ID(state,payload){
state.form[payload.order].question_id = payload.questionID;
},
};
我尝试输出的内容:
<div>
<h3 class="pb-3">Is first answer's title not empty?: {{!(answerForm[1].title === '')}}</h3>
<h3 class="pb-3">{{answerForm[0].title }}</h3>
<h3>{{answerForm}}</h3>
</div>
屏幕上显示的内容以及devtools告诉我的内容都在answerForm数组中:
我以非常相似的方式实现了问题部分。唯一的区别是,表单不是问题存储区中的数组,而是可以正常工作的。我在做什么错了?
答案 0 :(得分:1)
我认为问题出在这里
state.form[$i] = {
如果使用索引来更新数组,它将不会触发反应系统,并且您将获得已渲染组件的陈旧版本。参见https://vuejs.org/v2/guide/list.html#Caveats
有多种解决方法。您可以使用Vue.set
或选择创建一个全新的数组。
我不完全清楚为什么首先要进行所有复制,而不是仅使用state.form = answers
来解决问题。