Vue组件不显示商店数据

Posted

技术标签:

【中文标题】Vue组件不显示商店数据【英文标题】:Vue Component not showing store data 【发布时间】:2019-11-19 08:48:13 【问题描述】:

我正在建立一个琐事制作器。我目前正在编辑页面上处理一个问题。名为 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 数组中:

我以非常相似的方式实现了问题部分。唯一的区别是表单不是问题存储中的数组,但除此之外它工作正常。我做错了什么?

【问题讨论】:

【参考方案1】:

我认为问题出在这里:

state.form[$i] = 

如果您使用索引来更新数组,它不会触发反应系统,并且您将获得已渲染组件的陈旧版本。见https://vuejs.org/v2/guide/list.html#Caveats

有多种方法可以解决此问题。你可以使用 Vue.set 或者创建一个全新的数组。

我不完全清楚为什么你首先要做所有的复制而不是仅仅使用state.form = answers,这也可以解决问题。

【讨论】:

以上是关于Vue组件不显示商店数据的主要内容,如果未能解决你的问题,请参考以下文章

vue 组件不显示数据

vuex 商店不更新组件

如何在 Vuex 商店的 Vue.js 组件中设置动态样式

点击后渲染一个新的 Vue 组件

导入 Vue (Vue.js) 组件没有错误,但不显示

Vue子组件在第一页加载时不显示动态数据