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 !

ReactJS - Custom Hooks

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 :

  1. Détecter lorsque l'utilisateur a fait défiler jusqu'au bas de la page
  2. Déclencher une demande pour charger plus de données
  3. 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 :

  1. Nous importons useState et useEffect de React. Ceux-ci sont les briques de base de notre hook personnalisé.

  2. Notre hook useInfiniteScroll prend une fonction callback comme argument. Cela sera la fonction qui charge plus de données lorsque déclenchée.

  3. Nous créons une variable d'état isFetching avec useState. Cela suivra si nous sommes actuellement en train de fetcher des données.

  4. 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.

  5. Le second useEffect surveille les changements dans isFetching. Lorsqu'il devient vrai, il appelle notre fonction callback pour fetcher plus de données.

  6. 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 met isFetching à true.

  7. Enfin, nous retournons isFetching et setIsFetching 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 :

  1. Nous utilisons notre hook useInfiniteScroll, en lui passant la fonction fetchMoreListItems.
  2. fetchMoreListItems simule un appel API, ajoutant 20 nouveaux éléments à notre liste après un délai de 2 secondes.
  3. 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