Vuetify is a popular UI framework for Vue apps.
In this article, we’ll look at how to work with the Vuetify framework.
Async Autocomplete
The v-autocomplete
components work with async data sources.
For example, we can write:
<template>
<v-container>
<v-row>
<v-col col="12">
<v-toolbar dark color="teal">
<v-toolbar-title>State</v-toolbar-title>
<v-autocomplete
v-model="select"
:loading="loading"
:items="items"
:search-input.sync="search"
cache-items
class="mx-4"
flat
hide-no-data
hide-details
label="State"
solo-inverted
></v-autocomplete>
<v-btn icon>
<v-icon>mdi-dots-vertical</v-icon>
</v-btn>
</v-toolbar>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
name: "HelloWorld",
data() {
return {
loading: false,
items: [],
search: null,
select: null,
states: [
"Alabama",
"Alaska",
"American Samoa",
"Arizona",
"Arkansas"
],
};
},
watch: {
search(val) {
val && val !== this.select && this.querySelections(val);
},
},
methods: {
querySelections(v) {
this.loading = true;
setTimeout(() => {
this.items = this.states.filter((e) => {
return (e || "").toLowerCase().indexOf((v || "").toLowerCase()) > -1;
});
this.loading = false;
}, 500);
},
},
};
</script>
We have the select
state which is the model for the autocomplete.
And we have a watcher search
to make the query when the search
state changes.
In the querySelections
method calls filter
to filter the items.
Combobox
The v-combobox
component is a v-autocomplete
that lets us enter values that don’t exist with the provided items.
The created items will be returned as strings.
For example, we can write:
<template>
<v-container>
<v-row>
<v-col col="12">
<v-combobox
v-model="select"
:items="items"
label="Select activity"
multiple
></v-combobox>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
name: "HelloWorld",
data() {
return {
select: ["Vue"],
items: ["Programming", "Vue", "Vuetify"],
};
},
};
</script>
to add a v-combobox
component to create the dropdown.
items
populate the items with the items
array.
We have the multiple
prop to enable multiple selections.
label
has the label for dropdown.
v-model
sets the state from the selected item.
Now we see a dropdown with the items we can select.
Also, we can populate the data
slot with our own choice.
For instance, we can write:
<template>
<v-container>
<v-row>
<v-col col="12">
<v-combobox v-model="select" :items="items" label="Select activity" 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-row>
</v-container>
</template>
<script>
export default {
name: "HelloWorld",
data() {
return {
select: ["Vue"],
items: ["Programming", "Vue", "Vuetify"],
};
},
};
</script>
We have populate the selection
slot with the v-chip
component.
Dense
We can use the dense
prop to reduce the combo box height and max height of the list items:
<template>
<v-container>
<v-row>
<v-col col="12">
<v-combobox v-model="select" :items="items" label="Select activity" multiple dense></v-combobox>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
name: "HelloWorld",
data() {
return {
select: ["Vue"],
items: ["Programming", "Vue", "Vuetify"],
};
},
};
</script>
Conclusion
We can get async data with autocomplete.
Also, we can add a combobox to add a dropdown where we can add items.