Quasar is a popular Vue UI library for developing good looking Vue apps.
In this article, we’ll take a look at how to create Vue apps with the Quasar UI library.
Table Pagination
Quasar’s q-table
component comes with pagination capability built-in.
For instance, we can write:
<!DOCTYPE html>
<html>
<head>
<link
href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
rel="stylesheet"
type="text/css"
/>
<link
href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
rel="stylesheet"
type="text/css"
/>
</head>
<body class="body--dark">
<script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
<div id="q-app">
<q-layout
view="lHh Lpr lFf"
container
style="height: 100vh;"
class="shadow-2 rounded-borders"
>
<div class="q-pa-md">
<q-table
title="Treats"
:data="data"
:columns="columns"
row-key="name"
:pagination="initialPagination"
>
</q-table>
</div>
</q-layout>
</div>
<script>
const columns = [
{
name: "name",
required: true,
label: "Dessert",
align: "left",
field: (row) => row.name,
format: (val) => `${val}`,
sortable: true
},
{
name: "calories",
align: "center",
label: "Calories",
field: "calories",
sortable: true
},
{ name: "fat", label: "Fat (g)", field: "fat", sortable: true },
{
name: "calcium",
label: "Calcium (%)",
field: "calcium",
sortable: true,
sort: (a, b) => parseInt(a, 10) - parseInt(b, 10)
}
];
const data = [
{
name: "Frozen Yogurt",
calories: 159,
fat: 6.0,
calcium: "14%"
},
{
name: "Ice cream sandwich",
calories: 237,
fat: 9.0,
calcium: "8%"
},
{
name: "Eclair",
calories: 262,
fat: 16.0,
calcium: "6%"
},
{
name: "Honeycomb",
calories: 408,
fat: 3.2,
calcium: "0%"
},
{
name: "Donut",
calories: 452,
fat: 25.0,
calcium: "2%"
},
{
name: "KitKat",
calories: 518,
fat: 26.0,
calcium: "12%"
}
];
new Vue({
el: "#q-app",
data: {
columns,
data,
initialPagination: {
sortBy: "desc",
descending: false,
page: 2,
rowsPerPage: 3
}
}
});
</script>
</body>
</html>
We add the pagination
prop to set the pagination options.
sortBy
sets the sorting of the rows.
descending
lets us set whether to display data in descending order.
page
sets the current page number.
rowsPerPage
set the rows per page.
We can add the sync
modifier to the pagination
prop to get the current pagination data at any time.
Customize Pagination
We can customize the pagination feature by populating the pagination
slot:
<!DOCTYPE html>
<html>
<head>
<link
href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
rel="stylesheet"
type="text/css"
/>
<link
href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
rel="stylesheet"
type="text/css"
/>
</head>
<body class="body--dark">
<script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
<div id="q-app">
<q-layout
view="lHh Lpr lFf"
container
style="height: 100vh;"
class="shadow-2 rounded-borders"
>
<div class="q-pa-md">
<q-table
title="Treats"
:data="data"
:columns="columns"
row-key="name"
:pagination="initialPagination"
>
<template v-slot:pagination="scope">
<q-btn
v-if="scope.pagesNumber > 2"
icon="first_page"
color="grey-8"
round
dense
flat
:disable="scope.isFirstPage"
@click="scope.firstPage"
>
</q-btn>
<q-btn
icon="chevron_left"
color="grey-8"
round
dense
flat
:disable="scope.isFirstPage"
@click="scope.prevPage"
>
</q-btn>
<q-btn
icon="chevron_right"
color="grey-8"
round
dense
flat
:disable="scope.isLastPage"
@click="scope.nextPage"
>
</q-btn>
<q-btn
v-if="scope.pagesNumber > 2"
icon="last_page"
color="grey-8"
round
dense
flat
:disable="scope.isLastPage"
@click="scope.lastPage"
>
</q-btn>
</template>
</q-table>
</div>
</q-layout>
</div>
<script>
const columns = [
{
name: "name",
required: true,
label: "Dessert",
align: "left",
field: (row) => row.name,
format: (val) => `${val}`,
sortable: true
},
{
name: "calories",
align: "center",
label: "Calories",
field: "calories",
sortable: true
},
{ name: "fat", label: "Fat (g)", field: "fat", sortable: true },
{
name: "calcium",
label: "Calcium (%)",
field: "calcium",
sortable: true,
sort: (a, b) => parseInt(a, 10) - parseInt(b, 10)
}
];
const data = [
{
name: "Frozen Yogurt",
calories: 159,
fat: 6.0,
calcium: "14%"
},
{
name: "Ice cream sandwich",
calories: 237,
fat: 9.0,
calcium: "8%"
},
{
name: "Eclair",
calories: 262,
fat: 16.0,
calcium: "6%"
},
{
name: "Honeycomb",
calories: 408,
fat: 3.2,
calcium: "0%"
},
{
name: "Donut",
calories: 452,
fat: 25.0,
calcium: "2%"
},
{
name: "KitKat",
calories: 518,
fat: 26.0,
calcium: "12%"
}
];
new Vue({
el: "#q-app",
data: {
columns,
data,
initialPagination: {
sortBy: "desc",
descending: false,
page: 2,
rowsPerPage: 2
}
}
});
</script>
</body>
</html>
We get the number of pages with the scope.pagesNumber
property.
scope.isFirstPage
indicates whether we’re on the first page or not.
scope.firstPage
lets us go to the first page.
scope.prevPage
goes to the previous page.
scope.nextpage
goes to the next page.
scope.isLastPage
indicates whether we’re on the last page or not.
Conclusion
Quasar’s q-table
component lets us add pagination to a table easily.