Опция выбора Vue js не отображается из-за v-model

#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>