JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.js"></script>
<div id="app">
<div class="select-block">
<v-select
v-model="single"
:options="items"
label="single value"
></v-select>
<pre>{{ JSON.stringify(single) }}</pre>
</div>
<div class="select-block">
<v-select
v-model="multiple"
:options="items"
:multiple="true"
label="multiple values"
></v-select>
<pre>{{ JSON.stringify(multiple) }}</pre>
</div>
</div>
CSS
.select-block {
margin: 10px;
padding: 10px;
border: 1px solid silver;
}
JavaScript
Vue.component('v-select', {
props: [ 'label', 'value', 'options', 'multiple' ],
template: `
<label>
{{ label }}
<select v-model="innerValue" :multiple="multiple">
<option disabled value="" v-text="placeholder"></option>
<option v-for="n in options">{{ n }}</option>
</select>
</label>`,
computed: {
placeholder() {
return `Выберите ${this.multiple ? 'несколько значений' : 'одно значение'}`;
},
innerValue: {
get() {
const v = this.value;
return this.multiple || this.options.includes(v) ? v : '';
},
set(val) {
this.$emit('input', val);
},
},
},
});
new Vue({
el: '#app',
data: {
items: [ 'hello, world!!', 'fuck the world', 'fuck everything' ],
single: null,
multiple: [],
},
});