#vue.js #vuejs2
#vue.js #vuejs2
Вопрос:
Vue.js после загрузки страницы выберите значение, которое соответствует v-model, но игнорирует:выбранный атрибут. Код:
<select class="form-control " :required="true"
:class="{'is-invalid': errors.has('item_' index) }"
:name="'item_' index"
v-validate="'required'"
v-model="item.text_value"
v-if="item.type =='TYPE_TEXT' ">
<option
v-for="(itemz, index) in (getwords(item.product_parameter_value.text))"
:value="itemz"
v-bind:selected="index === 0"
>{{ itemz }}</option>
</select>
Значение item.text_value состоит из одного слова (Option2 и т.д.)
getwords(item.product_parameter_value.text) возвращает массив — [‘Option1’],[‘Option2’], [‘Option3’] и т.д.
Таким образом, выбранное значение всегда соответствует item.text_value, но не :выбрано.
Есть ли какой-либо способ присвоить выбранному значению значение первого элемента в массиве?
Комментарии:
1. Вы хотели бы переместить элемент в начало массива, чтобы он был наверху, но это действительно не идеально, поскольку это изменяет принятую в противном случае нормальную функциональность
2. пожалуйста, поделитесь фрагментом в реальном времени?
3. Вы не понимаете мою проблему. В выпадающем списке они отображаются в правильном порядке. Но vue всегда выбирает элемент, если они соответствуют значению v-model. Но мне нужно выбранное первое значение в массиве после загрузки страницы, а не значение v-model
Ответ №1:
Вы должны контролировать это, устанавливая v-model
правильное значение, вместо того, чтобы пытаться заставить DOM не синхронизироваться с моделью данных.
В идеале это можно было бы сделать, просто установив item.text_value
значение в блоке данных компонента; если правильное значение не может быть известно заранее, вы можете прочитать свою getwords
функцию до монтирования компонента, чтобы найти первый элемент:
new Vue({
el: '#app',
data: {
item: {
text_value: "" // ideally you would init the correct value here
}
},
methods: {
getwords() { // simplified stub for your data source:
return ["Option1", "Option2", "Option3"]
}
},
beforeMount() {
// if you can't init it in the data block,
// read the value from getwords() here instead:
this.item.text_value = this.getwords()[0]
}
});
<script src="https://unpkg.com/vue@latest/dist/vue.js"></script>
<div id="app">
<select v-model="item.text_value">
<option v-for="itemz, index) in (getwords())" :value="itemz">{{itemz}}</option>
</select>
</div>
Комментарии:
1. Спасибо, я раньше не понимал одну вещь. Данные в массиве должны совпадать с v-model. Vue.js иногда это так странно. Есть ли какая-нибудь хорошая книга для его изучения?
2. Просто массив представляет параметры, а v-model представляет выбранный параметр; так что да, чтобы они совпали, они должны быть идентичными. Vue использует немного иной подход, чем, например, jQuery — вместо работы в DOM вы хотите выполнять большую часть своей работы в модели данных и компонентных методах; DOM — это, по сути, побочный эффект.
3. (Извините, я не знаю книги, которую можно порекомендовать.)