ReactJS - Custom Hooks: Maîtriser le défilement infini
Bonjour, futurs développeurs React ! Aujourd'hui, nous allons entreprendre un voyage passionnant dans le monde des hooks personnalisés, en nous concentrant spécifiquement sur la mise en œuvre de la fonctionnalité de défilement infini. En tant que votre enseignant de science informatique de quartier, je vais vous guider pas à pas dans ce processus, en vous assurant de comprendre chaque concept au fur et à mesure. Alors, prenez votre boisson favorite, asseyez-vous confortablement, et plongeons dedans !
Comprendre les Hooks Personnalisés
Avant de plonger dans le défilement infini, penchons-nous un instant sur ce qu'est un hook personnalisé. Dans React, les hooks sont des fonctions qui vous permettent de "brancher" des fonctionnalités de l'état et du cycle de vie des composants fonctionnels. Les hooks personnalisés sont simplement des fonctions qui utilisent d'autres hooks et peuvent être partagés entre les composants.
Pensez aux hooks personnalisés comme à votre propre couteau suisse pour le développement React. Ils vous aident à extraire la logique des composants dans des fonctions réutilisables, rendant votre code plus propre et plus modulaire.
Mettre en œuvre la Fonctionnalité de Défilement Infini
Maintenant, abordons l'étoile de notre spectacle : le défilement infini. Vous avez probablement rencontré cette fonctionnalité sur les plateformes de réseaux sociaux ou les sites d'actualités, où le contenu continue de se charger lorsque vous faites défiler vers le bas. C'est un excellent moyen d'améliorer l'expérience utilisateur en presenting seamlessly plus de contenu sans avoir besoin de pagination.
Les Bases du Défilement Infini
Au cœur du défilement infini, il y a trois étapes principales :
- Détecter lorsque l'utilisateur a fait défiler jusqu'au bas de la page
- Déclencher une demande pour charger plus de données
- Ajouter les nouvelles données au contenu existant
Décomposons cela en morceaux gérables et créons notre hook personnalisé.
Mettre en œuvre le Hook useInfiniteScroll
Nous allons créer un hook personnalisé appelé useInfiniteScroll
. Ce hook gérera la logique pour détecter quand charger plus de contenu et fournira l'état et les fonctions nécessaires pour mettre en œuvre le défilement infini dans nos composants.
Voici la structure de base de notre hook :
import { useState, useEffect } from 'react';
const useInfiniteScroll = (callback) => {
const [isFetching, setIsFetching] = useState(false);
useEffect(() => {
window.addEventListener('scroll', handleScroll);
return () => window.removeEventListener('scroll', handleScroll);
}, []);
useEffect(() => {
if (!isFetching) return;
callback();
}, [isFetching]);
function handleScroll() {
if (window.innerHeight + document.documentElement.scrollTop !== document.documentElement.offsetHeight || isFetching) return;
setIsFetching(true);
}
return [isFetching, setIsFetching];
};
export default useInfiniteScroll;
Décomposons cela pièce par pièce :
-
Nous importons
useState
etuseEffect
de React. Ceux-ci sont les briques de base de notre hook personnalisé. -
Notre hook
useInfiniteScroll
prend une fonctioncallback
comme argument. Cela sera la fonction qui charge plus de données lorsque déclenchée. -
Nous créons une variable d'état
isFetching
avecuseState
. Cela suivra si nous sommes actuellement en train de fetcher des données. -
Le premier
useEffect
ajoute un écouteur d'événement de défilement lorsque le composant est monté et le supprime lorsque le composant est démonté. C'est notre nettoyage pour éviter les fuites de mémoire. -
Le second
useEffect
surveille les changements dansisFetching
. Lorsqu'il devient vrai, il appelle notre fonctioncallback
pour fetcher plus de données. -
La fonction
handleScroll
est où l'essentiel se passe. Elle vérifie si nous avons fait défiler jusqu'au bas de la page et si nous ne sommes pas déjà en train de fetcher des données. Si les deux conditions sont remplies, elle metisFetching
à true. -
Enfin, nous retournons
isFetching
etsetIsFetching
afin que le composant utilisant ce hook puisse accéder et mettre à jour cet état.
Maintenant, voyons comment nous pouvons utiliser ce hook dans un composant :
import React, { useState } from 'react';
import useInfiniteScroll from './useInfiniteScroll';
const InfiniteScrollComponent = () => {
const [items, setItems] = useState([]);
const [isFetching, setIsFetching] = useInfiniteScroll(fetchMoreListItems);
function fetchMoreListItems() {
// Simulation d'un appel API
setTimeout(() => {
setItems(prevItems => ([...prevItems, ...Array(20).fill(0).map((_, i) => ({ id: prevItems.length + i, name: `Item ${prevItems.length + i + 1}` }))]));
setIsFetching(false);
}, 2000);
}
return (
<div>
<ul>
{items.map(item => <li key={item.id}>{item.name}</li>)}
</ul>
{isFetching && 'Fetching more list items...'}
</div>
);
};
export default InfiniteScrollComponent;
Dans ce composant :
- Nous utilisons notre hook
useInfiniteScroll
, en lui passant la fonctionfetchMoreListItems
. -
fetchMoreListItems
simule un appel API, ajoutant 20 nouveaux éléments à notre liste après un délai de 2 secondes. - Nous rendons nos éléments de liste et affichons un message de chargement lorsque
isFetching
est true.
Et voilà ! Une implémentation fonctionnelle de défilement infini utilisant un hook React personnalisé.
Souvenez-vous, la beauté des hooks personnalisés réside dans leur réutilisabilité. Vous pouvez maintenant utiliser ce hook useInfiniteScroll
dans n'importe quel composant qui nécessite une fonctionnalité de défilement infini.
Conclusion
Les hooks personnalisés sont une fonctionnalité puissante dans React qui nous permettent de créer des logiques réutilisables. En implémentant le défilement infini comme un hook personnalisé, nous avons créé une solution flexible et réutilisable qui peut être intégrée facilement dans divers composants.
Alors que vous continuez votre voyage dans React, continuez à explorer et à créer des hooks personnalisés. Ils sont un excellent moyen de maintenir un code DRY (Ne vous répétez pas) et de conserver un codebase propre et modulaire.
Bonne programmation, et que vos défilements soient infinis ! ??
Méthode | Description |
---|---|
useInfiniteScroll(callback) |
Hook personnalisé pour implémenter le défilement infini |
useState(initialState) |
Hook React pour ajouter de l'état aux composants fonctionnels |
useEffect(effect, dependencies) |
Hook React pour effectuer des effets secondaires dans les composants fonctionnels |
addEventListener(event, handler) |
API Web pour attacher un gestionnaire d'événement à un élément |
removeEventListener(event, handler) |
API Web pour supprimer un gestionnaire d'événement d'un élément |
setTimeout(callback, delay) |
API Web pour exécuter une fonction après un délai spécifié |
Credits: Image by storyset