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
useStateetuseEffectde React. Ceux-ci sont les briques de base de notre hook personnalisé. -
Notre hook
useInfiniteScrollprend une fonctioncallbackcomme argument. Cela sera la fonction qui charge plus de données lorsque déclenchée. -
Nous créons une variable d'état
isFetchingavecuseState. Cela suivra si nous sommes actuellement en train de fetcher des données. -
Le premier
useEffectajoute 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
useEffectsurveille les changements dansisFetching. Lorsqu'il devient vrai, il appelle notre fonctioncallbackpour fetcher plus de données. -
La fonction
handleScrollest 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
isFetchingetsetIsFetchingafin 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. -
fetchMoreListItemssimule 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
isFetchingest 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
