Vuetify is a popular UI framework for Vue apps.
In this article, we’ll look at how to work with the Vuetify framework.
Data Tables Search
We can add a search
prop to allow us to filter data in a data table.
For example, we can write:
<template>
<v-card>
<v-card-title>
Nutrition
<v-spacer></v-spacer>
<v-text-field
v-model="search"
append-icon="mdi-magnify"
label="Search"
single-line
hide-details
></v-text-field>
</v-card-title>
<v-data-table :headers="headers" :items="desserts" :search="search"></v-data-table>
</v-card>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({
search: "",
headers: [
{
text: "Dessert (100g serving)",
align: "start",
sortable: false,
value: "name",
},
{ text: "Calories", value: "calories" },
{ text: "Fat (g)", value: "fat" },
],
desserts: [
{
name: "Frozen Yogurt",
calories: 200,
fat: 6.0,
},
{
name: "Ice cream sandwich",
calories: 200,
fat: 9.0,
},
{
name: "Eclair",
calories: 300,
fat: 16.0,
},
],
}),
};
</script>
We add the v-text-field
that binds to the search
state.
We pass search
into the search
prop and we can search any column we like.
Remove Default Header and Footer
The hide-default-header
and hide-default-footer
props let us remove the default header and footer.
For example, we can write:
<template>
<v-data-table
:headers="headers"
:items="desserts"
hide-default-header
hide-default-footer
class="elevation-1"
></v-data-table>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({
search: "",
headers: [
{
text: "Dessert (100g serving)",
align: "start",
sortable: false,
value: "name",
},
{ text: "Calories", value: "calories" },
{ text: "Fat (g)", value: "fat" },
],
desserts: [
{
name: "Frozen Yogurt",
calories: 200,
fat: 6.0,
},
{
name: "Ice cream sandwich",
calories: 200,
fat: 9.0,
},
{
name: "Eclair",
calories: 300,
fat: 16.0,
},
],
}),
};
</script>
Loading State
We can add the loading
prop to indicate that the table is loading.
Also, we can display a message when the table is loading.
For example, we can write:
<template>
<v-data-table item-key="name" class="elevation-1" loading loading-text="Loading... Please wait"></v-data-table>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({}),
};
</script>
The loading-text
lets us set the loading text to display.
Dense
We can add the dense
prop to make the rows shorter:
<template>
<v-data-table :headers="headers" :items="desserts" dense class="elevation-1"></v-data-table>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({
search: "",
headers: [
{
text: "Dessert (100g serving)",
align: "start",
sortable: false,
value: "name",
},
{ text: "Calories", value: "calories" },
{ text: "Fat (g)", value: "fat" },
],
desserts: [
{
name: "Frozen Yogurt",
calories: 200,
fat: 6.0,
},
{
name: "Ice cream sandwich",
calories: 200,
fat: 9.0,
},
{
name: "Eclair",
calories: 300,
fat: 16.0,
},
],
}),
};
</script>
Now the rows are shorter.
Conclusion
We can customize our table with search, sorting, and pagination with Vuetify.