#vue.js #vuejs2 #vue-component
#vue.js #vuejs2 #vue-компонент
Вопрос:
Итак, я работаю над некоторым кодом, который позволяет пользователю изменять хранилище, к которому они принадлежат. Я использую тег, и в нем у меня есть v-model. в теге я использую цикл for, чтобы указать хранилища, из которых пользователь может выбирать.
Вот мой код:
<div v-if="contestant.stores.length > 1" class="mt-10 col-sm-10">
<select class="form-control" v-model="riot_account_store" v-on:change="onChangeStore()">
<option v-for="store in contestant.stores" :key="store.objectId" :value="store.objectId">{{ store.name }}</option>
</select>
</div>
Все, что я хочу сейчас, это добавить «неизмененное» значение по умолчанию, которое будет отображаться ПЕРВЫМ перед всеми вариантами. В принципе, простая, <option>unchanged</option>
ничего особенного. Проблема в том, что когда я добавляю любую другую опцию, она просто пропускается. Она все еще появляется, если я нажимаю кнопку выбора, и она появляется над первым выбором из цикла. Таким образом, она компилируется, просто не «выбрана» в качестве первого значения. Понятия не имею, в чем проблема. Есть мысли?
Ответ №1:
Для вашей опции требуется значение. Вот и все:
const app = new Vue({
el: '#app',
data: {
riot_account_store: null,
stores: [
{ objectId: 12, name: 'Foo' },
{ objectId: 13, name: 'Bam' },
{ objectId: 14, name: 'Baz' },
],
},
methods: {
onChangeStore() {
console.log(this.riot_account_store);
},
},
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<div v-if="stores.length > 1" class="mt-10 col-sm-10">
<p>Selected: {{ riot_account_store }}</p>
<select class="form-control" v-model="riot_account_store" v-on:change="onChangeStore()">
<option :value="null">unselect</option>
<option v-for="store in stores" :key="store.objectId" :value="store.objectId">{{ store.name }}</option>
</select>
</div>
</div>
Ответ №2:
Добавьте значение по умолчанию option
, назначьте value
значение, которое не используется, и инициализируйте свое v-model
значение. Привязка Vue позаботится обо всем остальном.
<div v-if="contestant.stores.length > 1" class="mt-10 col-sm-10">
<select class="form-control" v-model="riot_account_store" v-on:change="onChangeStore()">
<option value="not_taken_id">default</option>
<option v-for="store in contestant.stores" :key="store.objectId" :value="store.objectId">{{ store.name }}</option>
</select>
</div>
date () {
return {
riot_account_store: 'not_taken_id'
}
}
Ответ №3:
Вам придется где-то сохранить «начальный» выбор, например, в блоке данных:
data() {
return {
initialSelection: { objectId: 10, name: 'Generic store name' } // you can set this property for example in the mounted() lifecycle-hook
}
Затем отредактируйте свой -Tag, чтобы:
<option v-for="store in contestant.stores" :key="store.objectId" :value="store.objectId">{{ store.objectId === initialSelection.objectId ? 'unchanged' : store.name }}</option>