Believemy logo purple

Mettre en place un loader au changement d'une page Nextjs

Avez-vous déjà été sur un site où vous cliquez sur un lien et rien ne se passe ? Ou peut-être vous êtes-vous demandé si votre demande a bien été reçue ? C'est ici que la mise en place d'un loader entre en jeu. Dans cet article, nous allons vous expliquer pourquoi il est important d'avoir un loader sur votre site web, comment le mettre en place dans votre projet Nextjs et créer une fonction qui permettra d'afficher le loader tant que la page n'est pas chargée. Si vous souhaitez améliorer l'expérience utilisateur sur votre site web et rassurer vos visiteurs, cet article est pour vous.
Mis à jour le 3 décembre 2024
Believemy logo

Pourquoi mettre en place un loader ?

La mise en place d'un loader permet à l'utilisateur de savoir ce qu'il se passe sur le site. En effet, il serait dommage qu'il ne se passe rien sur notre page... Le loader permet de communiquer avec l'utilisateur, de lui montrer que nous avons bien reçu sa requête.

 

Prérequis

La mise en place de ce loader se fera dans le Layout de votre site internet NextJS. Il faut donc bien avoir créé un fichier Layout.js (ou un nom équivalant) qui reprendra la base de vos pages dans votre projet.

 

Qu'est ce que le Layout ?

Le layout est un composant qui sera présent partout sur le site web, son code JSX et CSS sera appliqué sur toutes les pages du site.

Typiquement, on met dans le layout la base de chacune de nos pages : les balises head, le style CSS ainsi que les entêtes ou encore les pieds de page.

 

Création du loader

Nous allons faire une fonction qui verifie si l'URL change. Si c'est le cas, on change l'état du useState qui permet d'activer ou non le loader sur true. Dans ce cas, on retourne du code JSX qui s'affichera tant que la nouvelle page n'est pas chargée.

Dans le cas suivant, on écrit simplement un texte de chargement.

1.On commence par écrire une fonction dans laquelle on appelle le router et où on crée l'état du loading:

JAVASCRIPT
function Loading() {
        const router = useRouter();

        const [loading, setLoading] = useState(false);
}

 

2.On y ajoute un useEffect qui servira à vérifier si l'URL change.

JAVASCRIPT
useEffect(() => {
            const handleStart = (url) => (url !== router.asPath) && setLoading(true);
            const handleComplete = (url) => (url === router.asPath) && setLoading(false);

            router.events.on('routeChangeStart', handleStart)
            router.events.on('routeChangeComplete', handleComplete)
            router.events.on('routeChangeError', handleComplete)

            return () => {
                router.events.off('routeChangeStart', handleStart)
                router.events.off('routeChangeComplete', handleComplete)
                router.events.off('routeChangeError', handleComplete)
            }
        })

Quand le changement de page débute, on appele la fonction handleStart, qui change la valeur de loading sur TRUE.
Quand il se termine ou qu'il échoue, on appelle la fonction handleComplete, qui change la valeur de loading sur FALSE.

 

3.On retourne enfin du JSX.

JAVASCRIPT
return loading && (
            <>
                Chargement...
            </>
);

Ce JSX est le contenu qui est affiché au changement de la page.

 

Code obtenu

JAVASCRIPT
function Loading() {
        const router = useRouter();

        const [loading, setLoading] = useState(false);


        useEffect(() => {
            const handleStart = (url) => (url !== router.asPath) && setLoading(true);
            const handleComplete = (url) => (url === router.asPath) && setLoading(false);

            router.events.on('routeChangeStart', handleStart)
            router.events.on('routeChangeComplete', handleComplete)
            router.events.on('routeChangeError', handleComplete)

            return () => {
                router.events.off('routeChangeStart', handleStart)
                router.events.off('routeChangeComplete', handleComplete)
                router.events.off('routeChangeError', handleComplete)
            }
        })

        return loading && (
            <>
                Chargement...
            </>);
    }

Par la suite, nous allons devoir ajouter la balise <Loading /> dans le JSX du composant. Celle-ci permet d'appeler la fonction précédemment créée. Le loader s'affichera donc à l'endroit exact où vous placerez la balise.

Par exemple - Layout.js :

JAVASCRIPT
// Composant
import Loader from "loader.js";

export default function Layout(props) {
    return (
        <>
            // Tous vos composants
            <Loader />
        </>
    )
}

 

Ressources

Catégorie : Développement
Believemy logo
Commentaires (0)

Vous devez être connecté pour commenter cet article : se connecter ou s'inscrire.

Essayez gratuitement

Que vous essayiez de scaler votre start-up, de créer votre premier site internet ou de vous reconvertir en tant que développeur, Believemy est votre nouvelle maison. Rejoignez-nous, évoluez et construisons ensemble votre projet.

Believemy is with anyone