Dans l’article Projet : Simple Blog From Scratch Part7 nous avons vu comment récupérer tous les articles et aussi comment récupérer un article choisi.
Nous allons voir aujourd’hui comment ajouter une pagination afin de ne pas charger tous les articles sur la page d’accueil.
Ci-dessous le code modifié concernant le script fetchPosts.js
let currentPage = 1;
let postsPerPage = 6;
let totalPages = 1;
let allPosts = [];
async function fetchPosts() {
try {
const response = await fetch(`${urlApi}/posts/all`, {
method: 'GET',
});
if (response.status === 200) {
const data = await response.json();
allPosts = data.allPosts;
// Calcul du nombre total de pages en prenant le nombre total d'articles divisisé par la variable postsPerPage définie plus haut
totalPages = Math.ceil(allPosts.length / postsPerPage);
// Appel de la fonction renderPage(currentPage) afin d'afficher les articles de la première page
renderPage(currentPage);
// Appel de la fonction renderPaginationControls() permettant de naviguer dans les pages d'articles
renderPaginationControls();
} else {
console.log(response);
}
} catch (error) {
console.log(error);
}
};
function renderPage(page) {
const postsContainer = document.getElementById(postsContainerId);
const template = document.getElementById(templateId);
// Permet d'effacer le contenu précédent
postsContainer.innerHTML = '';
// Calcul des index de début et de fin pour les articles de cette page
const startIndex = (page - 1) * postsPerPage;
const endIndex = Math.min(startIndex + postsPerPage, allPosts.length);
// Boucle pour ajouter les posts de la page actuelle dans le conteneur "postsContainer" défini plus haut
for (let i = startIndex; i < endIndex; i++) {
const post = allPosts[i];
const seePost = document.importNode(template.content, true);
seePost.getElementById('postTitle').textContent = post.title;
seePost.getElementById('postContent').textContent = (post.content.length > 120 ? post.content.slice(0, 120) + '...' : post.content);
seePost.getElementById('postLink').href = `post.html?id=${post.id}`;
postsContainer.appendChild(seePost);
}
};
function renderPaginationControls() {
const paginationContainer = document.getElementById('paginationControls');
paginationContainer.innerHTML = '';
const prevButton = document.createElement('button');
prevButton.classList.add('paginationBtn');
prevButton.textContent = '<<';
prevButton.disabled = currentPage === 1;
// Fonction de clic pour changer de page
prevButton.onclick = () => {
if (currentPage > 1) {
currentPage--;
renderPage(currentPage);
renderPaginationControls();
}
};
paginationContainer.appendChild(prevButton);
// Affiche le numéro de page courant et total
const pageInfo = document.createElement('span');
pageInfo.classList.add('paginationNumbers');
pageInfo.textContent = `${currentPage} / ${totalPages}`;
paginationContainer.appendChild(pageInfo);
const nextButton = document.createElement('button');
// Fonction de clic pour changer de page
nextButton.classList.add('paginationBtn');
nextButton.textContent = '>>';
nextButton.disabled = currentPage === totalPages;
nextButton.onclick = () => {
if (currentPage < totalPages) {
currentPage++;
renderPage(currentPage);
renderPaginationControls();
}
};
paginationContainer.appendChild(nextButton);
};
fetchPosts();
La page index.html a également vue des petits changements.
<main class="general">
<!-- La section n'entoure désormais plus le template du fait de la modification apportée au script fetchPosts.js -->
<section class="posts" id="allPosts"></section>
<template id="templatePosts">
<div class="post">
<h2 id="postTitle"></h2>
<p id="postContent"></p>
<a id="postLink" href="#">Lire plus</a>
</div>
</template>
<div class="pagination" id="paginationControls"></div>
</main>
Le blog dispose désormais d’une pagination des articles !
Retrouvez les premiers articles du projet ici ⬇️
– Simple Blog From Scratch Part1
– Simple Blog From Scratch Part2
– Simple Blog From Scratch Part3
– Simple Blog From Scratch Part4
– Simple Blog From Scratch Part5
– Simple Blog From Scratch Part6
– Simple Blog From Scratch Part7
Consultante spécialisée dans les technologies Microsoft, je justifie de plus de 14 ans d’expérience dans le secteur IT.
Mon parcours professionnel, riche et varié, m’a permis de développer de solides compétences, tant techniques qu’humaines. Je suis reconnue pour ma capacité à analyser rapidement les enjeux techniques et à concevoir des solutions pertinentes, y compris sur des problématiques complexes.
Mon approche proactive, alliée à mes compétences en développement, me permet de proposer des évolutions efficaces, toujours en cohérence avec les objectifs métiers.
En parallèle de mon activité professionnelle, je prends plaisir à approfondir mes compétences techniques en réalisant des projets personnels. Je développe notamment des jeux web basés sur React et PHP, ainsi que des applications orientées métier avec SPFx.