Vuetify is a popular UI framework for Vue apps.
In this article, we’ll look at how to work with the Vuetify framework.
Customizing Default Header
We can customize the default header with the header.<name>
slot.
<name>
is the name of the value
property in the header item sent to headers
.
For example, we can write:
<template>
<v-data-table :headers="headers" :items="desserts" class="elevation-1">
<template v-slot:header.name="{ header }">{{ header.text.toUpperCase() }}</template>
</v-data-table>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({
headers: [
{
text: "Dessert (100g serving)",
align: "start",
value: "name",
},
{ text: "Calories", value: "calories" },
{ text: "Fat (g)", value: "fat" },
],
desserts: [
{
name: "Frozen Yogurt",
calories: 159,
fat: 6.0,
},
{
name: "Ice cream sandwich",
calories: 237,
fat: 9.0,
},
{
name: "Eclair",
calories: 262,
fat: 16.0,
},
],
}),
};
</script>
to add a table with our own headings.
We populate the header.name
slot to customize the display of the name
column heading.
We display it as upper case.
Customizing Columns
We can customize some columns with the item.<name>
slot.
<name>
is the property name of the column we want to change.
For example, we can write:
<template>
<v-data-table :headers="headers" :items="desserts" class="elevation-1">
<template v-slot:item.calories="{ item }">
<v-chip :color="getColor(item.calories)" dark>{{ item.calories }}</v-chip>
</template>
</v-data-table>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({
headers: [
{
text: "Dessert (100g serving)",
align: "start",
value: "name",
},
{ text: "Calories", value: "calories" },
{ text: "Fat (g)", value: "fat" },
],
desserts: [
{
name: "Frozen Yogurt",
calories: 159,
fat: 6.0,
},
{
name: "Ice cream sandwich",
calories: 237,
fat: 9.0,
},
{
name: "Eclair",
calories: 262,
fat: 16.0,
},
],
}),
methods: {
getColor(calories) {
if (calories > 400) return "red";
else if (calories > 200) return "orange";
else return "green";
},
},
};
</script>
We add a chip to the item.calories
slot to change how the calories column is displayed.
External Pagination
We can add external pagination with the options
prop.
For instance, we can write:
<template>
<div>
<v-data-table
:headers="headers"
:items="desserts"
:page.sync="page"
:items-per-page="itemsPerPage"
hide-default-footer
class="elevation-1"
[@page](http://twitter.com/page "Twitter profile for @page")-count="pageCount = $event"
></v-data-table>
<div class="text-center pt-2">
<v-pagination v-model="page" :length="pageCount"></v-pagination>
<v-text-field
:value="itemsPerPage"
label="Items per page"
type="number"
min="-1"
max="15"
[@input](http://twitter.com/input "Twitter profile for @input")="itemsPerPage = parseInt($event, 10)"
></v-text-field>
</div>
</div>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({
page: 1,
pageCount: 0,
itemsPerPage: 10,
headers: [
{
text: "Dessert (100g serving)",
align: "start",
value: "name",
},
{ text: "Calories", value: "calories" },
{ text: "Fat (g)", value: "fat" },
],
desserts: [
{
name: "Frozen Yogurt",
calories: 159,
fat: 6.0,
},
{
name: "Ice cream sandwich",
calories: 237,
fat: 9.0,
},
{
name: "Eclair",
calories: 262,
fat: 16.0,
},
],
}),
methods: {
getColor(calories) {
if (calories > 400) return "red";
else if (calories > 200) return "orange";
else return "green";
},
},
};
</script>
to add a text field to our page to let users change the items per page.
Also, we added the v-pagination
component to add the pagination buttons.
Conclusion
We can change how columns and pagination buttons are displayed with various components and slots.