组合框
v-combobox
组件是一个 v-autocomplete ,允许用户输入在提供的 tems 中不存在的值。创建的项目将作为字符串返回。
用例
使用组合框,您可以允许用户创建可能不在提供的项列表中显示的新值。
由于 Combobox 允许用户输入,所以它 总是 返回提供给它的完整值(例如,当 Object 的列表时,总是返回一个 Object)。这是因为没有办法区分一个值是用户输入还是对象查询 GitHub问题
menu-props 的 auto 属性只支持默认输入样式。
浏览器自动完成默认设置为关闭,可能因浏览器而异,可能会被忽略。MDN
API
从下面选择您想要的组件,并查看可用的属性、插槽、事件和函数。
示例
下面是一些简单到复杂的例子。
多个组合框
以前称为 tags - 允许用户输入多个值
template script
<template>
<v-container fluid>
<v-row>
<v-col cols="12">
<v-combobox
v-model="select"
:items="items"
label="Select a favorite activity or create a new one"
multiple
></v-combobox>
</v-col>
<v-col cols="12">
<v-combobox
v-model="select"
:items="items"
label="I use chips"
multiple
chips
></v-combobox>
</v-col>
<v-col cols="12">
<v-combobox
v-model="select"
:items="items"
label="I use a scoped slot"
multiple
chips
>
<template v-slot:selection="data">
<v-chip
:key="JSON.stringify(data.item)"
v-bind="data.attrs"
:input-value="data.selected"
:disabled="data.disabled"
@click:close="data.parent.selectItem(data.item)"
>
<v-avatar
class="accent white--text"
left
v-text="data.item.slice(0, 1).toUpperCase()"
></v-avatar>
{{ data.item }}
</v-chip>
</template>
</v-combobox>
</v-col>
<v-col cols="12">
<v-combobox
v-model="select"
label="I'm readonly"
chips
multiple
readonly
></v-combobox>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
data () {
return {
select: ['Vuetify', 'Programming'],
items: [
'Programming',
'Design',
'Vue',
'Vuetify',
],
}
},
}
</script>
密集
您可以使用 dense
属性来降低组合框的高度并降低列表项的最大高度。
template script
<template>
<v-container fluid>
<v-row>
<v-col cols="12">
<v-combobox
v-model="select"
:items="items"
label="Combobox"
multiple
outlined
dense
></v-combobox>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
data () {
return {
select: ['Vuetify', 'Programming'],
items: [
'Programming',
'Design',
'Vue',
'Vuetify',
],
}
},
}
</script>
Vuetify Discord
Get help with an issue, report a bug or connect with other developers on Discord
ads by Vuetify
](https://community.vuetifyjs.com?ref=vuetifyjs.com)
没有带纸片的数据
在本例中,我们使用一个自定义的 no-data 插槽在 搜索/创建 项时为用户提供上下文。
template script
<template>
<v-container fluid>
<v-combobox
v-model="model"
:items="items"
:search-input.sync="search"
hide-selected
hint="Maximum of 5 tags"
label="Add some tags"
multiple
persistent-hint
small-chips
>
<template v-slot:no-data>
<v-list-item>
<v-list-item-content>
<v-list-item-title>
No results matching "<strong>{{ search }}</strong>". Press <kbd>enter</kbd> to create a new one
</v-list-item-title>
</v-list-item-content>
</v-list-item>
</template>
</v-combobox>
</v-container>
</template>
<script>
export default {
data: () => ({
items: ['Gaming', 'Programming', 'Vue', 'Vuetify'],
model: ['Vuetify'],
search: null,
}),
watch: {
model (val) {
if (val.length > 5) {
this.$nextTick(() => this.model.pop())
}
},
},
}
</script>
高级自定义选项
v-combobox
改进了 v-select
和 v-autocomplete
的功能。这为您提供了一个可扩展的接口来创建真正的自定义实现。这个示例利用了一些更高级的特性,比如自定义filter 算法、内联列表编辑和动态输入项。
template script
<template>
<v-container fluid>
<v-combobox
v-model="model"
:filter="filter"
:hide-no-data="!search"
:items="items"
:search-input.sync="search"
hide-selected
label="Search for an option"
multiple
small-chips
solo
>
<template v-slot:no-data>
<v-list-item>
<span class="subheading">Create</span>
<v-chip
:color="`${colors[nonce - 1]} lighten-3`"
label
small
>
{{ search }}
</v-chip>
</v-list-item>
</template>
<template v-slot:selection="{ attrs, item, parent, selected }">
<v-chip
v-if="item === Object(item)"
v-bind="attrs"
:color="`${item.color} lighten-3`"
:input-value="selected"
label
small
>
<span class="pr-2">
{{ item.text }}
</span>
<v-icon
small
@click="parent.selectItem(item)"
>close</v-icon>
</v-chip>
</template>
<template v-slot:item="{ index, item }">
<v-text-field
v-if="editing === item"
v-model="editing.text"
autofocus
flat
background-color="transparent"
hide-details
solo
@keyup.enter="edit(index, item)"
></v-text-field>
<v-chip
v-else
:color="`${item.color} lighten-3`"
dark
label
small
>
{{ item.text }}
</v-chip>
<v-spacer></v-spacer>
<v-list-item-action @click.stop>
<v-btn
icon
@click.stop.prevent="edit(index, item)"
>
<v-icon>{{ editing !== item ? 'mdi-pencil' : 'mdi-check' }}</v-icon>
</v-btn>
</v-list-item-action>
</template>
</v-combobox>
</v-container>
</template>
<script>
export default {
data: () => ({
activator: null,
attach: null,
colors: ['green', 'purple', 'indigo', 'cyan', 'teal', 'orange'],
editing: null,
index: -1,
items: [
{ header: 'Select an option or create one' },
{
text: 'Foo',
color: 'blue',
},
{
text: 'Bar',
color: 'red',
},
],
nonce: 1,
menu: false,
model: [
{
text: 'Foo',
color: 'blue',
},
],
x: 0,
search: null,
y: 0,
}),
watch: {
model (val, prev) {
if (val.length === prev.length) return
this.model = val.map(v => {
if (typeof v === 'string') {
v = {
text: v,
color: this.colors[this.nonce - 1],
}
this.items.push(v)
this.nonce++
}
return v
})
},
},
methods: {
edit (index, item) {
if (!this.editing) {
this.editing = item
this.index = index
} else {
this.editing = null
this.index = -1
}
},
filter (item, queryText, itemText) {
if (item.header) return false
const hasValue = val => val != null ? val : ''
const text = hasValue(itemText)
const query = hasValue(queryText)
return text.toString()
.toLowerCase()
.indexOf(query.toString().toLowerCase()) > -1
},
},
}
</script>