Ниже я обрисовал два разных подхода.В целом, я думаю, что предпочитаю второй подход, но он может зависеть от ваших обстоятельств, которые лучше всего подходят для вас.
new Vue({
el: '#app',
components: {
'v-select': VueSelect.VueSelect
},
data: function() {
return {
input: {
user_id: 2
},
users: []
}
},
methods: {
getOptionLabel (option) {
return (option && option.name) || ''
}
},
created () {
setTimeout(() => {
this.users = [
{
id: 1,
name: "John",
last: "Doe"
},
{
id: 2,
name: "Harry",
last: "Potter"
},
{
id: 3,
name: "George",
last: "Bush"
}
]
const currentUser = this.users.find(user => user.id === this.input.user_id)
this.$refs.select.updateValue(currentUser)
}, 1000)
}
})
<link rel="stylesheet" href="https://unpkg.com/vue-select@3.1.0/dist/vue-select.css">
<script src="https://unpkg.com/vue@2.6.10/dist/vue.js"></script>
<script src="https://unpkg.com/vue-select@3.1.0/dist/vue-select.js"></script>
<div id="app">
<v-select
ref="select"
v-model="input.user_id"
:options="users"
:reduce="user => user.id"
:get-option-label="getOptionLabel"
></v-select>
</div>
Основным препятствием является то, что Vue Select использует внутреннее состояние для отслеживания текущего выбранного значения при использовании reduce
.См .:
https://github.com/sagalbot/vue-select/blob/master/src/components/Select.vue#L833
Хуже того, значение, хранимое в этом состоянии, является не сокращенным идентификатором, а целым объектом из options
.Так что, если вначале нет options
, он попадает в правильный беспорядок, и не очень легко вывести его из этого беспорядка.
Я использовал вызов updateValue
длядать ему удар после загрузки options
.Я также использовал пропеллер get-option-label
вместо label
, чтобы не показывать число во время загрузки данных.
Альтернативой может быть создание v-select
только после того, как options
станут доступны., так как он работает нормально, если они все присутствуют, когда он впервые создан.Макет v-select
может быть использован в качестве заполнителя при ожидании данных.Это выглядит так:
new Vue({
el: '#app',
components: {
'v-select': VueSelect.VueSelect
},
data: function() {
return {
input: {
user_id: 2
},
users: []
}
},
created () {
setTimeout(() => {
this.users = [
{
id: 1,
name: "John",
last: "Doe"
},
{
id: 2,
name: "Harry",
last: "Potter"
},
{
id: 3,
name: "George",
last: "Bush"
}
]
}, 1000)
}
})
<link rel="stylesheet" href="https://unpkg.com/vue-select@3.1.0/dist/vue-select.css">
<script src="https://unpkg.com/vue@2.6.10/dist/vue.js"></script>
<script src="https://unpkg.com/vue-select@3.1.0/dist/vue-select.js"></script>
<div id="app">
<v-select
v-if="users.length === 0"
key="dummy"
disabled
placeholder="Loading..."
></v-select>
<v-select
v-else
v-model="input.user_id"
:options="users"
:reduce="user => user.id"
label="name"
></v-select>
</div>
Использование key
здесь важно, поскольку оно гарантирует, что Vue не будет повторно использовать тот же v-select
и вместо этого создаст новый.Есть и другие способы добиться этого, но key
, вероятно, самый чистый.