Как предварительно выбрать опцию vue-multiselect, когда options - это массив объектов?
Я хочу предварительно выбрать конкретное значение в раскрывающемся списке выбора, созданного vue-multiselect
,
Я могу заставить это работать нормально, если у меня есть простой массив строк, как показано ниже:
['Test 1', 'Test 2', 'Test 3']
Однако, когда я использую массив объектов, я не могу заставить это работать. Например, если у меня есть следующее:
<v-multiselect :options="[{id: 1, name: 'Test 1'}, {id: 2, name: 'Test 2'}, {id: 3, name: 'Test 3'}]"
label="name"
track-by="id"
v-model="test">
</v-multiselect>
Независимо от того, что я установил test
Свойство data, с которым связана v-модель, не будет предварительно выбирать значение. я пробовал 1
, 2
, 3
, '1'
, '2'
а также '3'
за test
когда track-by
является id
а также 'Test 1'
и т. д., когда track-by
является name
но ничего не работает.
Что я здесь не так делаю? Я посмотрел на документы по адресу https://vue-multiselect.js.org/, но, похоже, они не дают пример, когда вы хотите предварительно установить значение для массива объектов для варианты. Поиск в Google также не вернул то, что я ищу.
Что касается смежной темы, как только я получу эту работу, что я должен изменить, чтобы выбрать несколько значений, когда я устанавливаю компонент на multiple
? Спасибо.
4 ответа
track-by
использование
Документы указывают, что track-by
"Используется для сравнения объектов. Используется только в том случае, если параметры являются объектами ".
То есть он указывает ключ объекта, который будет использоваться при сравнении значений объекта в options
, Документы должны фактически заявить, что track-by
требуется, когда параметры являются объектами, потому что <vue-multiselect>
использования track-by
чтобы определить, какие параметры в раскрывающемся списке выбраны, и правильно удалить выбранный параметр из множественного выбора.
Без track-by
вы бы увидели два ошибочных поведения для опций объекта: (1) пользователь сможет повторно выбрать уже выбранные опции, и (2) попытка удалить выбранные опции вместо этого приведет к повторной вставке всех опций.
Установка начальных значений
<vue-multiselect>
не поддерживает автоматический перевод массива значений, но вы можете легко сделать это из родительского компонента.
Создайте локальное свойство данных для указания
track-by
и начальные значения множественного выбора (например, именованныеtrackBy
а такжеinitialValues
соответственно):export default { data() { return { //... trackBy: 'id', initialValues: [2, 5], } } }
привязывать
<vue-multiselect>.track-by
вthis.trackBy
а также<vue-multiselect>.v-model
вthis.value
:<vue-multiselect :track-by="trackBy" v-model="value">
Создать наблюдателя на
this.initialValues
который отображает эти значения в массив объектов на основеthis.trackBy
, настройкаthis.value
к результату:export default { watch: { initialValues: { immediate: true, handler(values) { this.value = this.options.filter(x => values.includes(x[this.trackBy])); } } } }
Vue.component('v-multiselect', window.VueMultiselect.default);
new Vue({
el: '#app',
data () {
return {
trackBy: 'id',
initialValues: [5,2],
value: null,
options: [
{ id: 1, name: 'Vue.js', language: 'JavaScript' },
{ id: 2, name: 'Rails', language: 'Ruby' },
{ id: 3, name: 'Sinatra', language: 'Ruby' },
{ id: 4, name: 'Laravel', language: 'PHP' },
{ id: 5, name: 'Phoenix', language: 'Elixir' }
]
}
},
watch: {
initialValues: {
immediate: true,
handler(values) {
this.value = this.options.filter(x => values.includes(x[this.trackBy]));
}
}
}
})
<script src="https://unpkg.com/vue@2.6.6/dist/vue.min.js"></script>
<script src="https://unpkg.com/vue-multiselect@2.1.0"></script>
<link rel="stylesheet" href="https://unpkg.com/vue-multiselect@2.1.0/dist/vue-multiselect.min.css">
<div id="app">
<v-multiselect :track-by="trackBy"
:options="options"
v-model="value"
label="name"
multiple>
</v-multiselect>
<pre>{{ value }}</pre>
</div>
Похоже на ошибку. Обходной путь должен использовать фактическую ссылку на object
Vue.component('v-multiselect', window.VueMultiselect.default);
let testOptions=[{id: 1, name: 'Test 1'}, {id: 2, name: 'Test 2'}, {id: 3, name: 'Test 3'}]
new Vue({
el: '#app',
data: function () {
return {
test: testOptions[1], // <- use an object ref here!
testOptions
};
}
});
Самый простой способ, который я обнаружил, - это отправить весь объект из BE, чтобы он был предварительно выбран. Если вы отправите тот же объект из BE, он будет предварительно выбран. Но я не знаю, жестко ли запрограммированы ваши варианты на FE или они взяты из базы данных или чего-то еще. У меня была такая же проблема, но мои значения исходили из моей базы данных, поэтому было легко воспроизвести объект
В вашем вопросе просто отсутствует :object="true" на самом деле они не знали, что это тип строки или объекта, когда мы передаем это, он знает, что да, это объект, и мне нужно label="name" из v-model=" test", выбирает его и показывает как предварительно выбранный