如何使用 vue.js 在 select 中设置默认 selected 值?
How to set default selected value in select with vue.js?
因此,我需要根据对外部端点的查询结果生成 x 数量的 "selects"。
下面是 json 的示例,这是我用来生成选择的数据。
这个例子在一个 "questions" 的数组中只包含一个 "question"。 (此外,"answers" 中的数组构造有点夸张,但这就是我必须处理的)
"questions": [{
"question": [
{
"answers": [
{
"answer": [
{
"answer": "Answer 1",
"id": 216,
"questionID": 83,
"selected": false,
"sortOrder": 1
},
{
"answer": "Answer 2",
"id": 217,
"questionID": 83,
"selected": true,
"sortOrder": 2
},
... plus x number of "answers" here..
]
}
],
"question": "Question 1",
}
]}
...]
所以,我像这样生成选择(我已经从不相关的样式中删除了示例):
<v-layout row wrap v-for="question in questionnaire.questions[0].question"
:key="question.id">
<span>{{question.question}}</span>
<v-select
item-text="answer"
item-value="id"
:items="question.answers[0].answer"
ref="answer_selects"
></v-select>
现在,回到我的问题。正如您在 json 中看到的,第二个 "answer" 有一个 属性 "selected",其值为 "true"。这意味着我必须将此特定项目设置为选中 "by default"。我如何以良好的 vue 方式实现这一目标?
如果您只想将其设置为默认值,您可以使用 :value
-属性 并传递答案数组中具有 select 的第一个对象编辑设置为真。
:value="question.answers[0].answer.find(answer -> answer.selected)"
请注意,当使用该值时,该值未绑定到 selected 的内容,因此如果您 select 一个不同的项目,父组件中的数据将不会更新!如果你想让它自动更新,你应该考虑使用 v-model 和 computed-properties。
编辑:
好的,所以我更深入地研究了你的问题,我想我想出了一个很好的解决方案。
首先,我不太理解你在v-select组件中设置的属性,因为其中none是在VueSelect Api中定义的。在这个答案中,我使用那里定义的属性。另外,我不太确定如何解释您的数据结构,所以我将给出一个示例,其中包含一组问题,其中包含一个 id、一个问题文本和一组答案。
为了将 v-model 与计算的 属性 一起使用,您必须实现一个 getter ,它将被调用以设置 v-select-component 数据和一个setter 用于在 select 组件中 select 编辑不同的项目时更新数据。由于在您的情况下,您必须为问题数组中的每个元素计算一个 属性,因此您应该将问题对象的显示包装到它自己的组件中,并在循环中显示多个。
Vue.component('v-select', VueSelect.VueSelect);
Vue.component("question", {
"template": "#questionTemplate",
"props": {
"question": Object
},
"computed": {
"selectedId": {
"get": function() {
return this.question.answers.find(answer => answer.selected).id;
},
"set": function(id) {
//set selected flag on newly selected element
this.question.answers.find(answer => answer.id === id).selected = true;
//reset previous choice
this.question.answers.find(answer => answer.selected && answer.id !== id).selected = false;
}
}
}
});
new Vue({
"el": "#app",
"data": function() {
return {
"questions": [
{
"id": 83,
"question": "QuestionText",
"answers": [
{
"answer": "Answer 1",
"id": 216,
"questionID": 83,
"selected": false,
"sortOrder": 1
},
{
"answer": "Answer 2",
"id": 217,
"questionID": 83,
"selected": true,
"sortOrder": 2
}
]
}
]
}
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://unpkg.com/vue-select@latest"></script>
<link rel="stylesheet" href="https://unpkg.com/vue-select@latest/dist/vue-select.css">
<div id="app">
<question v-for="question in questions" :question="question" :key="question.id"></question>
</div>
<script type="text/x-template" id="questionTemplate">
<div>
<p>{{question.question}}</p>
<v-select
v-model="selectedId"
:options="question.answers"
label="answer"
:reduce="answer => answer.id"></v-select>
<p>Selected AnswerId: {{selectedId}}</p>
</div>
</script>
如果你希望能够 select 多个值,VueSelect 组件将 return 一组 ID 而不是一个 ID,因此你必须调整计算的 getter 和 setter 相应地。
希望我能帮到你,如果你需要任何进一步的帮助,请告诉我!
因此,我需要根据对外部端点的查询结果生成 x 数量的 "selects"。
下面是 json 的示例,这是我用来生成选择的数据。 这个例子在一个 "questions" 的数组中只包含一个 "question"。 (此外,"answers" 中的数组构造有点夸张,但这就是我必须处理的)
"questions": [{
"question": [
{
"answers": [
{
"answer": [
{
"answer": "Answer 1",
"id": 216,
"questionID": 83,
"selected": false,
"sortOrder": 1
},
{
"answer": "Answer 2",
"id": 217,
"questionID": 83,
"selected": true,
"sortOrder": 2
},
... plus x number of "answers" here..
]
}
],
"question": "Question 1",
}
]}
...]
所以,我像这样生成选择(我已经从不相关的样式中删除了示例):
<v-layout row wrap v-for="question in questionnaire.questions[0].question"
:key="question.id">
<span>{{question.question}}</span>
<v-select
item-text="answer"
item-value="id"
:items="question.answers[0].answer"
ref="answer_selects"
></v-select>
现在,回到我的问题。正如您在 json 中看到的,第二个 "answer" 有一个 属性 "selected",其值为 "true"。这意味着我必须将此特定项目设置为选中 "by default"。我如何以良好的 vue 方式实现这一目标?
如果您只想将其设置为默认值,您可以使用 :value
-属性 并传递答案数组中具有 select 的第一个对象编辑设置为真。
:value="question.answers[0].answer.find(answer -> answer.selected)"
请注意,当使用该值时,该值未绑定到 selected 的内容,因此如果您 select 一个不同的项目,父组件中的数据将不会更新!如果你想让它自动更新,你应该考虑使用 v-model 和 computed-properties。
编辑: 好的,所以我更深入地研究了你的问题,我想我想出了一个很好的解决方案。
首先,我不太理解你在v-select组件中设置的属性,因为其中none是在VueSelect Api中定义的。在这个答案中,我使用那里定义的属性。另外,我不太确定如何解释您的数据结构,所以我将给出一个示例,其中包含一组问题,其中包含一个 id、一个问题文本和一组答案。
为了将 v-model 与计算的 属性 一起使用,您必须实现一个 getter ,它将被调用以设置 v-select-component 数据和一个setter 用于在 select 组件中 select 编辑不同的项目时更新数据。由于在您的情况下,您必须为问题数组中的每个元素计算一个 属性,因此您应该将问题对象的显示包装到它自己的组件中,并在循环中显示多个。
Vue.component('v-select', VueSelect.VueSelect);
Vue.component("question", {
"template": "#questionTemplate",
"props": {
"question": Object
},
"computed": {
"selectedId": {
"get": function() {
return this.question.answers.find(answer => answer.selected).id;
},
"set": function(id) {
//set selected flag on newly selected element
this.question.answers.find(answer => answer.id === id).selected = true;
//reset previous choice
this.question.answers.find(answer => answer.selected && answer.id !== id).selected = false;
}
}
}
});
new Vue({
"el": "#app",
"data": function() {
return {
"questions": [
{
"id": 83,
"question": "QuestionText",
"answers": [
{
"answer": "Answer 1",
"id": 216,
"questionID": 83,
"selected": false,
"sortOrder": 1
},
{
"answer": "Answer 2",
"id": 217,
"questionID": 83,
"selected": true,
"sortOrder": 2
}
]
}
]
}
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://unpkg.com/vue-select@latest"></script>
<link rel="stylesheet" href="https://unpkg.com/vue-select@latest/dist/vue-select.css">
<div id="app">
<question v-for="question in questions" :question="question" :key="question.id"></question>
</div>
<script type="text/x-template" id="questionTemplate">
<div>
<p>{{question.question}}</p>
<v-select
v-model="selectedId"
:options="question.answers"
label="answer"
:reduce="answer => answer.id"></v-select>
<p>Selected AnswerId: {{selectedId}}</p>
</div>
</script>
如果你希望能够 select 多个值,VueSelect 组件将 return 一组 ID 而不是一个 ID,因此你必须调整计算的 getter 和 setter 相应地。
希望我能帮到你,如果你需要任何进一步的帮助,请告诉我!