A basic sorted table for Vue.js
Install with NPM:
npm install --save vue-sorted-tableImport globally in app:
import SortedTablePlugin from "vue-sorted-table"; Vue.use(SortedTablePlugin);Or, using Vue:
buildModules: [ // ... 'vue-sorted-table/nuxt' ]The basic example shows how to use the SortedTable and SortLink components:
<template> <div id="app"> <sorted-table :values="values"> <thead> <tr> <th scope="col" style="text-align: left; width: 10rem;"> <sort-link name="id">ID</sort-link> </th> <th scope="col" style="text-align: left; width: 10rem;"> <sort-link name="name">Name</sort-link> </th> <th scope="col" style="text-align: left; width: 10rem;"> <sort-link name="hits">Hits</sort-link> </th> </tr> </thead> <tbody #body="{ values }"> <tr v-for="value in values" :key="value.id"> <td>{{ value.id }}</td> <td>{{ value.name }}</td> <td>{{ value.hits }}</td> </tr> </tbody> </sorted-table> </div> </template> <script> export default { name: "App", data: function() { return { values: [ { name: "Plugin Foo", id: 2, hits: 33 }, { name: "Plugin Bar", id: 1, hits: 42 }, { name: "Plugin Foo Bar", id: 3, hits: 79 } ] }; } }; </script>The sorted-table tag requires a values property, which is an array of objects which contain the data:
<sorted-table :values="values"> </sorted-table>The sort-link tag adds a link to sort the provided data. In the case the name property value is the current sorting, the component adds a sort icon, depending on the actual order:
<sort-link name="id">ID</sort-link>The sorted data is made accessible as a scoped slot.
<template #body="sort"> <tbody> </tbody> </template>Now we can access the slot scope via sort and iterate over the sorted values to render the data:
<tr v-for="value in sort.values" :key="value.id"> <td>{{ value.id }}</td> <td>{{ value.name }}</td> <td>{{ value.hits }}</td> </tr>The advanced example is based on the basic example. It shows how to use the plugin configuration to set global sort icons:
Vue.use(SortedTablePlugin, { ascIcon: '<i class="material-icons">arrow_drop_up</i>', descIcon: '<i class="material-icons">arrow_drop_down</i>' });By default, the objects containing the values has to be a flat object. To support nested objects ({ name: "Plugin Foo", user: { id: 1, name: "David Campbell" } }) the plugin uses lodash.
At first, install lodash:
npm install --save lodashImport lodash and register Vue prototype:
import _ from "lodash"; Vue.prototype.$_ = _;Add sort link using the nested key:
<sort-link name="user.name">Username</sort-link>Extend v-for loop to render nested value:
<tr v-for="value in sort.values" :key="value.id"> <td>{{ value.id }}</td> <td>{{ value.name }}</td> <td>{{ value.hits }}</td> <td>{{ value.user.name }}</td> </tr>The SortedTable and SortLink components can be used without registering the plugin. Import the components, e.g. as part of a singe file component:
import { SortedTable, SortLink } from "vue-sorted-table";Register components locally:
export default { name: "App", components: { SortedTable, SortLink }, data: function() { return { // .. }; } };Add sort icons as property of the SortedTable tag:
<sorted-table :values="values" ascIcon="<span> ▲</span>" descIcon="<span> ▼</span>" > <!-- .. --> </sorted-table>The plugin configuration allows to set global sort icons, e.g. Advanced Example
| Option | Description |
|---|---|
ascIcon | Ascending sort icon. |
descIcon | Descending sort icon. |
The SortedTable is the main component of the plugin. It is intended to be a replacement of the <table></table> tag. So instead using the old table tags, use <SortedTable></SortedTable>.
This component has the following properties:
| Property | Required | Default | Description |
|---|---|---|---|
values | yes | null | Array of objects containing the values which should be sorted. |
dir | no | asc | Sort direction. Valid values: ("asc"|"desc") |
sort | no | id | Default sorting. Could be any valid object key. |
ascIcon | no | Ascending icon. Overwrites default or globally set icon. | |
descIcon | no | Descending icon. Overwrites default or globally set icon. | |
onSort | no | null | Alternative function for value sorting. |
This component emits the following event:
sort-table- This event will be emited on each new sort action, e.g. click on sort link.
- arg0: sort property name, e.g. id
- arg1: sort direction, e.g. asc
This component adds a link to sort the given values. A sort icon is attached automatically to link.
This component has the following properties:
| Property | Required | Default | Description |
|---|---|---|---|
name | yes | The object key name on which the values will be sorted. |
| Slot | Description |
|---|---|
| Default | Slot to pass link text. |
| Icon | Slot to use custom sort icons. |