从子组件创建一个 aswers 数组,然后在 Vue.js 2 中将此数组发送给父组件

Create an aswers array from a child component then emit this array to the parent in Vue.js 2

我正在使用 Vue 2 构建调查,我正在尝试构建答案数组并将其发送到名为 Evaluation 的父组件,如下所示:https://pastebin.com/rLEUh56a

我有一个名为 QuestionItem.vue 的组件,它是 Evaluation 的子组件,如下所示:https://pastebin.com/RFPgKs5Q

answers 数组需要像这样才能发送到 API:

answers: [
  {
    questionId: "6a9ad778-aacf-4e60-9610-37a767700b9f",
    questionOptionIds:[
      "1bc35f6c-900a-4764-84ee-23531e46e638",
    ],
    answer: null
  },
  {
    questionId: "d1c3f4f0-9525-4e6e-bb81-599d84b5cb02f",
    questionOptionIds:[],
    answer: "answered value"
  },
]

如果 question.typetextrangestarsfaces,则 questionOptionIds 需要为空并且 answer 属性 需要是回答的值,但是如果 question.typeradiocheck,则回答 属性 需要是空的,并且questionOptionIds 属性 需要是用户选择的回答选项。

我不确定如何根据在 QuestionItem.vue 组件中输入的每个答案构建此数组。

谢谢你的时间,祝你有愉快的一天!

您不能像这样在您的 QuestionItem 组件上使用 v-model 作为答案:

<QuestionItem 
                                v-for="(question, index) in questions"
                                :key="index"
                                :question="question"
                                :index="questionIndex"
                                v-model="answers"
                                class="flex-none w-full"
                            />

v-model 将获取从 child 发出的输入值并将其设置为答案,这在这种情况下没有任何意义,因为答案是每个答案的数组,而不是单一答案。

您将需要在 parent 组件中有一个自定义事件处理程序。像这样:

// in Evaluation.vue methods
answerChanged(answer) {
    // remove this answer if it's already in the array
    answers = answers.filter(a=>a.questionId != answer.questionId);
    // add the submitted answer
    answers.push(answer);
}

然后使用事件处理程序代替 v-model:

 <QuestionItem 
                                v-for="(question, index) in questions"
                                :key="index"
                                :question="question"
                                :index="questionIndex"
                                @input="answerChanged" //bind the event handler
                                class="flex-none w-full"
                            />

最后,您需要将 questionId 添加到您发出的值中。这是一个近似值,您可能需要对其进行调整以适合您正在寻找的确切格式:

 watch: {
    questionValue(newValue) {
        // emit the value that we want for a single answer in our parent answers array
        this.$emit('input', {
           questionId: question.id,
           questionOptionIds:question.options,
           answer: newValue
        })
    },
},