Tableau avec pagination
Création d’un tableau paginé qui récupère des données d’une API.
Création de l’API
La première étape consiste à créer l’API qui récupérera les données que l’on souhaite afficher dans notre tableau paginé. Vous pouvez créer un dossier src/services/getUsersFromApi
qui contiendra le service permettant d'appeler cette API.
Vous pouvez commencer par définir l’interface décrivant les données qui seront retournées par l'API dans le fichier src/services/getUsersFromApi/types.d.ts
:
export interface User {
firstname: string;
lastname: string;
email: string;
}
export interface Result {
items: User[];
total: number;
}
Maintenant, vous devez définir l’instance axios qui sera utilisée pour récupérer les données, elle doit être définie dans le fichier @/plugins/axios
:
import axios from 'axios';
/** Axios instance to request our APIs */
const instance = axios.create({
withCredentials: false,
baseURL: WINDOW.API_URL,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
}
});
export {
instance as axios
};
Nous utilisons une variable d’environnement pour spécifier l’URL de base de notre instance axios, vous pouvez consulter le guide sur la gestion des variables d’environnement.
Ensuite, vous pouvez définir une fonction asynchrone appelée getUsersFromApi
qui aura pour but de récupérer les données.
Notre fonction attendra paramètre un objet qui contiendra les options dont notre API a besoin pour trier nos données. L’interface de ces options est DataOptions
que nous importons de Vuetify :
import { DataOptions } from 'vuetify';
Nous utiliserons plus loin dans ce guide seulement 4 propriétés de l’interface DataOptions
:
sortBy
: indique sur quels champs les données doivent êtres triées, le type attendu eststring[]
,sortDesc
: indique si les données doivent être triées de manière ascendante ou descendante, le type attendu estboolean
,page
: indique le numéro de la page dont nous souhaitons voir les données, le type attendu estnumber
,itemsPerPage
: indique le nombre d’items par page que nous voulons voir affichés, le type estnumber
.
L’interface DataOptions
permet d’autres options, vous pouvez consulter l’API du composant PaginatedTable
Enfin, vous devez définir la fonction qui effectuera l'appel API dans le fichier src/services/getUsersFromApi/api.ts
en utilisant l’instance que vous avez définie précédemment :
import { axios, AxiosResponse } from '@/plugins/axios';
import { DataOptions } from 'vuetify';
import { Result } from '@/services/getUsersFromApi/types';
export function getUsersFromApi(options: DataOptions): Promise<AxiosResponse<Result>> {
return axios.get('/mon-api.example', {
params: {
...options
}
});
}
Affichage du tableau paginé
Pour afficher les données, vous pouvez utiliser le composant PaginatedTable
:
<template>
<PaginatedTable
:options.sync="options"
:headers="headers"
:items="users"
:server-items-length="totalUsers"
:loading="state === StateEnum.PENDING"
suffix="api-example"
@update:options="fetchData"
/>
</template>
<script lang="ts">
import Vue from 'vue';
import Component from 'vue-class-component';
import { DataOptions } from 'vuetify';
import { User } from '@/services/getUsers/types';
import { getUsersFromApi } from '@/services/getUsers/api';
import { StateEnum } from '@cnamts/vue-dot/src/constants/enums/StateEnum';
@Component
export default class PaginatedTableApi extends Vue {
StateEnum = StateEnum;
state = StateEnum.IDLE;
options = {} as DataOptions;
headers = [
{
text: 'Nom',
value: 'lastname'
},
{
text: 'Prénom',
value: 'firstname'
},
{
text: 'Email',
value: 'email'
}
];
users: User[] = [];
totalUsers = 0;
async fetchData(): Promise<void> {
this.state = StateEnum.PENDING;
try {
const res = await getUsersFromApi(this.options);
const { items, total } = res.data;
this.users = items;
this.totalUsers = total;
this.state = StateEnum.RESOLVED;
} catch(err) {
this.state = StateEnum.REJECTED;
}
}
}
</script>
Pour afficher le tableau de données, vous devez définir un tableau headers
pour indiquer quelles sont les différentes colonnes que nous voulons afficher et quelles données afficher.
Cette variable sera ensuite passée dans la prop headers
du composant PaginatedTable
.
Les valeurs de l’objet options
seront mises à jour par le composant PaginatedTable
.
C’est la fonction fetchData
qui utilisera notre API pour récupérer les données. Elle sera appelée lorsque l’objet options
sera modifié grâce à la directive @update:options="fetchData"
.
Une fois récupérés, nous stockerons les items
dans la variables users
et le nombre total d’items total
dans la variable totalUsers
pour les passer respectivement au tableau dans les props items
et server-items-length
.
L’enum StateEnum
et la variable state
servent à gérer l’état de chargement du tableau via la prop loading
, qui active le chargement lorsque la fonction fetchData
est appelée et ce tant qu’elle n’a pas reçu de réponse qu’il s’agisse de données ou d’une erreur.