Sorting
To enable column sorting, instead of using vanilla th elements we will use v-th Components for the columns
that will allow sorting.
Table Header Component v-th
The v-th component renders to a regular th element but it allows you to sort the table, it has three properties:
sortKey, customSort and defaultSort.
Sort Key Propery sortKey: String | Function
The sortKey property is used to get the Row value we will sort by it can either be a String or a Function.
String
As a String, it represents the path to the property in the Row we want to sort. You can even use nested paths.
<thead slot="head">
<v-th sortKey="name">Name</v-th>
<v-th sortKey="address.state">State</v-th>
</thead>
Function
If you instead pass a Function, we will call it with the current row as a parameter and expect to get back
the value used for sorting.
<thead slot="head">
<v-th :sortKey="nameLength">Name</v-th>
</thead>
methods: {
nameLength (row) {
return `row.name.length`
}
}
Once we have used the key property to get the column values, we will compare them.
If the values are number we will just compare them by subtraction.
Otherwise we will call toString() on them and compare them with localCompare.
Custom Sort Property customSort: Function
In some cases you need more control over sorting,
for instance if you have a complex object or your sorting depends in two or more values.
For those instances instead of providing a key property you can use the custom property to provide a sorting function.
The function will receive the 2 rows being compared and a third parameter with the sort order
where 1 represents ascending and -1 represents descending.
The function needs to return 1 if the first row is greater, -1 if the second row is greater
or 0 if they are the same.
<thead slot="head">
<v-th :customSort="dateSort">Registered</v-th>
</thead>
methods: {
dateSort(a, b) {
let date1 = new Date(a.registered).getTime();
let date2 = new Date(b.registered).getTime();
return date1 - date2;
}
}
Default Sort Property defaultSort: String
You should provide this for the one column you want the table to be sorted by default.
The possible values are: asc for ascending ordering and desc for descending order.
<thead slot="head">
<v-th sortKey="name" defaultSort="desc">Name</v-th>
</thead>
Example
<template>
<v-table
:data="users"
>
<thead slot="head">
<v-th :sortKey="nameLength" defaultSort="desc">Name</v-th>
<v-th sortKey="age">Age</v-th>
<v-th sortKey="address.state">State</v-th>
<v-th :customSort="dateSort">Registered</v-th>
</thead>
<tbody slot="body" slot-scope="{displayData}">
<tr v-for="row in displayData" :key="row.guid">
<td>{{ row.name }}</td>
<td>{{ row.age }}</td>
<td>{{ row.address.state }}</td>
<td>{{ row.registered }}</td>
</tr>
</tbody>
</v-table>
</template>
<script>
import users from './users.json'
export default {
name: 'Sorting',
data: () => ({
users
}),
methods: {
nameLength (row) {
return row.name.length
},
dateSort(a, b) {
let date1 = new Date(a.registered).getTime();
let date2 = new Date(b.registered).getTime();
return date1 - date2;
}
}
}
</script>
| Name | Age | State | Registered |
|---|---|---|---|
| Deana Lindsay | 25 | Pennsylvania | 2015-10-30 |
| Wyatt Kline | 39 | Maine | 2014-06-17 |
| Harmon Huber | 29 | American Samoa | 2016-01-25 |
| Penny Maddox | 29 | Oregon | 2016-01-08 |
| Morgan Gomez | 39 | Connecticut | 2014-04-10 |
| Beck Mckay | 35 | Mississippi | 2016-05-06 |
| Massey Carlson | 39 | Hawaii | 2014-10-22 |
| Hill Hale | 33 | Colorado | 2016-04-18 |
| Stokes Hurst | 26 | North Dakota | 2016-01-30 |
| Cain Knapp | 20 | Michigan | 2016-01-04 |
CSS icons
By default we include three SVG icons to indicate the sorting state of a column. But you can use CSS Styles to change the sort icons.
The first thing you need to do is to disable the default sort icons with the hideSortIcons property on the v-table component:
<v-table
:data="users"
:hideSortIcons="true"
>
...
</v-table>
Then you will get 4 CSS classes for th elements with sorting enabled:
vt-sort: This class is always present, its purpose is to provide a constant CSS class for the columns with sorting.vt-sortable: This class indicates the column can be sorted and it is present when the column is not currently sorted.vt-asc: This class indicates the column is being sorted by an ascending order.vt-desc: This class indicates the column is being sorted by a descending order.
For this example we will use FontAwesome icons:
.vt-sort:before{
font-family: FontAwesome;
padding-right: 0.5em;
width: 1.28571429em;
display: inline-block;
text-align: center;
}
.vt-sortable:before{
content: "\f0dc";
}
.vt-asc:before{
content: "\f160";
}
.vt-desc:before{
content: "\f161";
}
| Name | Age | State |
|---|---|---|
| Reese Velez | 35 | Tennessee |
| Kayla Morgan | 33 | District Of Columbia |
| Benson Snyder | 20 | Marshall Islands |
| Strickland Andrews | 32 | Florida |
| Castro Hanson | 21 | Texas |
| Iris Nielsen | 21 | South Carolina |
| Dionne Boyer | 23 | Nevada |
| Cooke Alford | 33 | Delaware |
| Goff Lamb | 24 | Kansas |
| Barry Ramsey | 21 | California |