Site icon Blog ARC Optimizer

Implémentation d'écrans squelettes dans React


À propos de l'auteur

Blessing Krofegha est un ingénieur logiciel basé à Lagos au Nigeria, avec un ardent désir de contribuer à rendre le Web génial pour tous, en écrivant et en construisant…
En savoir plus sur
Bénédiction

Dans ce didacticiel, vous apprendrez ce qu'est une interface utilisateur d'écran squelette et certains types de bibliothèques d'écran squelette, ainsi que leurs avantages et inconvénients. Nous allons créer une interface utilisateur d'écran squelette de type YouTube à l'aide de React Loading Skeleton . Ensuite, vous pouvez expérimenter par vous-même avec le package React d'écran squelette de votre choix.

Les filateurs et les chargeurs sont traditionnellement le moyen de dire aux utilisateurs que le contenu va prendre un certain temps à charger. Bien que cette approche soit excellente, elle devient rapidement obsolète dans le développement moderne. Les écrans squelettes deviennent le remplacement parfait des chargeurs traditionnels car ils se concentrent sur la progression plutôt que sur les temps d'attente, ce qui réduit la frustration liée au temps de chargement.

Dans cet article, nous ne passerons pas en revue les bases de CSS React ou de la syntaxe JavaScript, vous n'avez donc pas besoin d'être un expert dans l'une ou l'autre de ces langues pour suivre.

La ​​différence entre un chargeur et une interface utilisateur d'écran squelette ( Large preview )

Les experts de l'interface utilisateur et de l'expérience utilisateur nous apprennent que, pendant que les utilisateurs attendent que le contenu se charge sur une page, nous devons les maintenir engagés.

L'idée derrière l'utilisation de spinners pour engager les utilisateurs avant le chargement du contenu est excellente; cependant, le résultat peut être loin d'être idéal car la plupart des utilisateurs s'ennuieront à regarder un simulateur animé comme s'il s'agissait d'une horloge. Luke Wroblewski développe à ce sujet.

Les écrans squelettes offrent une meilleure expérience utilisateur en réduisant la frustration du temps de chargement. En se concentrant sur les progrès plutôt que sur les temps d'attente, cela crée l'illusion pour les utilisateurs que les informations seront affichées progressivement à l'écran. Bill Chung dans sa recherche le confirme .

Qu'est-ce qu'un écran squelette?

Un écran squelette est une version de l'interface utilisateur qui ne contient pas de contenu réel; au lieu de cela, il imite la mise en page de la page en montrant ses éléments sous une forme similaire au contenu réel au fur et à mesure qu'il se charge et devient disponible (c'est-à-dire lorsque la latence du réseau le permet).

Un écran squelette est essentiellement un filaire de la page, avec un espace réservé

Qu'est-ce qui est unique à propos d'un écran squelette?

Une interface utilisateur squelette ressemble à l'interface utilisateur réelle de la page, afin que les utilisateurs comprennent à quelle vitesse l'application Web ou mobile se chargera avant même que le contenu n'apparaisse. Voici quelques raisons pour lesquelles vous pourriez envisager d'utiliser des écrans squelettes dans votre prochain projet:

  • imiter la mise en page d'une page est plus facile avec un écran squelette,
  • le contenu se charge progressivement (pas tous en même temps).

Les écrans squelettes sont également appelés:

  • éléments fantômes,
  • espaces réservés de contenu,
  • chargeurs de contenu.

Blockchain.com, YouTube, Facebook, Medium et d'autres grandes sociétés de technologie affichent des écrans squelettes pendant que leur contenu

Blockchain.com

État partiellement chargé de Blockchain.com (remarquez comment un squelette est utilisé dans l'analyse graphique) ( Grand aperçu ])

Moyen

Interface utilisateur squelette moyen ( Grand aperçu )

LinkedIn

État de chargement du flux d'accueil de LinkedIn en 2018 ( Grand aperçu )

Typ es d'écrans squelettes

Il existe différents types d'écrans squelettes . Les principaux sont les espaces réservés de texte et les espaces réservés d'image (ou de couleur).

La plupart des développeurs préfèrent utiliser des espaces réservés de texte comme interface utilisateur squelette sur leurs pages car ils sont faciles à créer, et le développeur n'a pas besoin de détails sur le substance du contenu réel; au lieu de cela, le squelette imite l'interface utilisateur.

Les espaces réservés aux couleurs sont plus difficiles à créer car ils nécessitent des détails sur le contenu.

Certains packages populaires facilitent la mise en œuvre des écrans squelettes dans les applications Web. Examinons de plus près les deux:

Nous examinerons les avantages et les inconvénients de chaque package, avant de déterminer lesquels utiliser pour notre application.

React Placeholder

Avantages

  • Les composants d'espace réservé sont utilisé pour créer une interface utilisateur squelette personnalisée.
  • L'animation d'impulsion (c'est-à-dire l'effet de mouvement sur un élément) est prise en charge.
  • Elle est fournie avec une API basée sur les composants.

Contre

  • Les composants squelettes sont gérés séparément, donc la mise à jour des styles d'un composant nécessite peut-être également la mise à jour du composant squelette.
  • La ​​courbe d'apprentissage n'est pas linéaire car il existe plusieurs composants pour des besoins différents.

Ce qui suit est un exemple de composant squelette utilisant la réaction . -placeholder package:

 import {TextBlock, RectShape} à partir de 'react-placeholder / lib / placeholders';
importer ReactPlaceholder depuis 'react-placeholder';

const GhostPlaceholder = () => (
  
); <ReactPlaceholder ready = {ready} customPlaceholder = {}>   

Importation TextBlock et RectShape de react-placeholder / lib / placeholder et ReactPlaceholder de react-placeholder ]nous avons créé un composant fonctionnel nommé GhostPlaceholder . GhostPlaceholder a un div, et à l'intérieur du div, nous avons utilisé le composant RectShape, qui décrit les dimensions d'un rectangle, transmet la valeur de n'importe quelle couleur et définit les styles du rectangle.

Ensuite, nous utilisé le composant TextBlock pour définir les valeurs des lignes et de la couleur. Le composant TextBlock définit le nombre de lignes et la couleur du texte.

Nous passons MyComponent en tant qu'enfant du composant ReactPlaceholder qui reçoit ready et le composant GhostPlaceholder en tant que valeurs pour ses ready et customPlaceholder accessoires.

Le MyComponent se chargera lorsque le l'interface utilisateur de l'écran du squelette est affichée.

Pour en savoir plus, consultez la documentation .

React Loading Skeleton

Pour

  • Il est basé sur l'API et comporte un composant avec des accessoires pour toute personnalisation.
  • Il peut être utilisé comme un composant squelette séparé et également directement à l'intérieur de n'importe quel composant, donc il est flexible.
  • Il prend en charge le thème et l'animation par impulsions.

Contre

  • Il est facile à mettre en œuvre pour un simple UI squelette, mais compliqué pour les squelettes plus complexes.
  • Avoir un s séparé Le composant keleton rendra la maintenance plus difficile lorsque l'interface utilisateur et les styles changent.

Voici un exemple de React Loading Skeleton:

 import Skeleton, {SkeletonTheme} de "react-loading-skeleton";

const SkeletonComponent = () => (
  
    
);

Nous avons importé Skeleton et SkeletonTheme de la bibliothèque react-loading-skeleton puis créé un composant fonctionnel qui rend le SkeletonTheme composant, avec couleur et hightlightColor comme propriétés.

Le composant SkeletonTheme est utilisé pour le thème (par exemple, pour ajouter des effets de couleur à l'interface utilisateur squelette).

Enfin, à l'intérieur de la section, nous définissons le composant Skeleton avec les propriétés de hauteur et de largeur et leurs valeurs appropriées transmises.

Création d'une interface utilisateur d'écran de type squelette de type YouTube

créer un écran squelette de type YouTube, à l'aide de React Loading Skeleton, pour montrer le fonctionnement d'une interface utilisateur squelette.

Configurer React

La manière la plus simple de configurer React consiste à utiliser Créer une application React qui est «un moyen officiellement pris en charge pour créer des applications React sur une seule page. Il offre une configuration de construction moderne sans configuration. »

Nous l’utiliserons pour amorcer l’application que nous allons créer. Depuis votre terminal, exécutez la commande ci-dessous:

 npx create-react-app skeleton-screens && cd skeleton-screens

Une fois l'installation terminée, démarrez le serveur React en exécutant npm start :

Page d'accueil de React ( Grand aperçu ) [19659077] Créer l'interface utilisateur YouTube sans écran squelette

Commençons par saisir des données factices YouTube. Les points d'extrémité réels seraient normalement utilisés à la place des données factices, mais dans ce didacticiel, nous utiliserons des données factices.

Créez un fichier dans votre dossier src / et nommez-le data.js ajoutez-y le code suivant.

 const dummyData = [
  {
    section: "Recommended",
    channel: "CNN",
    items: [
      {
        id: "fDObf2AeAP4",
        image: "https://img.youtube.com/vi/fDObf2AeAP4/maxresdefault.jpg",
        title: "75 million Americans ordered to stay home",
        views: "1.9M views",
        published: "3 days agos"
      },
      {
        id: "3AzIgAa0Cm8",
        image: "https://img.youtube.com/vi/3AzIgAa0Cm8/maxresdefault.jpg",
        title: "Gupta: The truth about using chloroquine to fight coronavirus pandemic",
        views: "128K views",
        published: "4 hours ago"
      },
      {
        id: "92B37aXykYw",
        image: "https://img.youtube.com/vi/92B37aXykYw/maxresdefault.jpg",
        title: "Willie Jones STUNS Simon Cowell In Pitch Perfect Performance of 'Your Man'!",
        views: "2.47 million views",
        published: "1 month ago"
      },
      {
        id: "J6rVaFzOEP8",
        image: "https://img.youtube.com/vi/J6rVaFzOEP8/maxresdefault.jpg",
        title: "Guide To Becoming A Self-Taught Software Developer",
        views: "104K views",
        published: "17 days ago"
      },
      {
        id: "Wbk8ZrfU3EM",
        image: "https://img.youtube.com/vi/Wbk8ZrfU3EM/maxresdefault.jpg",
        title: "Tom Hanks and Rita Wilson test positive for coronavirus",
        views: "600k views",
        published: "1 week ago"
      },
      {
        id: "ikHpFgKJax8",
        image: "https://img.youtube.com/vi/ikHpFgKJax8/maxresdefault.jpg",
        title: "Faces Of Africa- The Jerry Rawlings story",
        views: "2.3 million views",
        published: "2014"
      }
    ]
  },
  {
    section: "Dernières nouvelles",
    chaîne: "CGTN America",
    articles: [
      {
        id: "tRLDPy1A8pI",
        image: "https://img.youtube.com/vi/tRLDPy1A8pI/maxresdefault.jpg",
        title: "Is Trump blaming China for COVID-19? You decide.",
        views: "876k views",
        published: "9 days ago"
      },
      {
        id: "2ulH1R9hlG8",
        image: "https://img.youtube.com/vi/2ulH1R9hlG8/maxresdefault.jpg",
        title: "Journalist still goes to office during pandemic, see her daily routine",
        views: "873 views",
        published: "3 hours ago"
      },
      {
        id: "_TkfQ9MaIgU",
        image: "https://img.youtube.com/vi/_TkfQ9MaIgU/maxresdefault.jpg",
        title: "How are small businesses going to survive the economic downturn of the COVID-19 era?",
        views: "283 views",
        published: "4 day ago"
      }
    ]
  }
];
exporter les données factices par défaut;

Pour répliquer le format YouTube, nous avons créé des données factices qui ont un tableau d'objets, avec des propriétés telles que l'ID, l'image, le titre, le nombre de vues et la date de publication.

Ensuite, créons notre interface utilisateur YouTube. Nous aurons trois composants:

Carte Contient les détails de la vignette de la vidéo, le titre, le nombre de vues, la date de publication et la chaîne.
CardList Renvoie toutes les cartes d'affilée.
App Monte notre objet dummyData charge l'interface utilisateur du squelette pendant deux secondes et renvoie le composant CardList .

Dans votre dossier src créez un dossier et nommez-le composants . Dans le dossier composants créez un fichier Card.js ajoutez-y le code suivant:

 import React from "react";
const Card = ({item, channel}) => {
    revenir (
      
  • {item.title}

    {channel}

    {item.views} • {item.published}           
  • );   };   exporter la carte par défaut;

    Nous avons créé un composant Card . À l'intérieur, nous avons importé React de react et nous avons déconstruit les item et channel accessoires pour qu'ils puissent être utilisés à travers Composant de la carte . Chaque composant d'élément Card qui affiche une vidéo affichera la miniature, le nombre de vues, la date de publication et le titre.

    Composant CardList

    À l'intérieur du dossier composants créez un dossier Fichier CardList.js et ajoutez-y le code suivant:

     import React from "react";
    importer la carte à partir de "./Card";
    const CardList = ({list}) => {
        revenir (
          
              {list.items.map ((item, index) => {           retour ;         })}       
        );   };   exporter CardList par défaut;

    Dans ce composant, nous avons importé le composant Card que nous avons créé. La carte accepte les éléments de canal et que nous obtenons en mappant à travers list.items . Nous exportons ensuite ce composant en tant que CardList car nous allons l'utiliser dans notre composant App .

    Remarque : Les éléments tableau qui est mappé dans ce composant est le tableau d'objets de notre dummyData .

    Composant d'application

    À l'intérieur du fichier app.js dans le fichier src / supprimez le code qui s'y trouve et ajoutez-y ce qui suit:

     import React, {useState, useEffect} de "react";
    import "./App.css";
    importer dummyData depuis "./data";
    importer CardList depuis "./components/CardList";
    
    const App = () => {
      const [videos, setVideos] = useState ([]);
      const [loading, setLoading] = useState (false);
    
      useEffect (() => {
        setLoading (true);
        const timer = setTimeout (() => {
          setVideos (dummyData);
          setLoading (false);
        }, 5000);
        return () => clearTimeout (timer);
      }, []);
      revenir (
        
          {         videos.map ((liste, index) => {           revenir (             

    {list.section}


    );         })}     
      ); }; exporter l'application par défaut;

    Dans ce composant, nous avons importé les crochets useState et useEffect aux côtés de React et les autres fichiers que nous avons créés et qui seront nécessaires. dans le composant App .

    Parce que nos données sont des données factices, nous devons les simuler comme les données de l'API en chargeant le contenu après un délai de deux secondes, en utilisant le JavaScript [1945901048]. ] setTimeout méthode .

    Ensuite, dans le composant App nous créons un état vidéo et définissons l'état sur un tableau vide à l'aide de useState . [19659005] Pour charger nos données fictives, nous utiliserons le crochet useEffect . Dans notre crochet, nous créons une minuterie variable qui contient la fonction setTimeout () . À l'intérieur de la fonction, nous définissons notre état vidéo sur notre objet dummyData et nous nous assurons que les données se chargent au bout de deux secondes, et, enfin, nous annulons le minuteur lors du démontage.

    Enfin, nous mappons notre vidéo indique et renvoie l'élément de section qui contient la section de liste et le composant CardList avec ses accessoires de liste.

    Ajout de CSS

    Jusqu'à présent, nous avons utilisé beaucoup de classes sans CSS réel. Dans le dossier src supprimez tout dans App.css et remplacez-le par le code suivant:

     .App {
      largeur max: 960px;
      marge: 0 auto;
      taille de police: 16px;
    }
    .liste {
      affichage: flex;
      justifier-contenu: espace entre;
      flex-wrap: wrap;
      style liste: aucun;
      rembourrage: 0;
    }
    .section titre {
      margin-top: 30 pixels;
    }
    .carte {
      largeur: calc (33% - 10px);
      marge: 20px 0;
    }
    .card-link {
      couleur: hériter;
      décoration de texte: aucune;
    }
    .card-image {
      largeur: 100%;
    }
    .channel-image {
      rayon-frontière: 100%;
      rembourrage: 0, 10px, 0, 0;
      largeur: 40px;
      hauteur: 40px;
    }
    .card-title {
      margin-top: 10 pixels;
      marge en bas: 0;
    }
    .card-channel {
      margin-top: 5 pixels;
      marge en bas: 5px;
      taille de police: 14px;
    }
    /* Comprimés */
    @media (largeur maximale: 1 000 pixels) {
      .App {
        largeur max: 600px;
      }
      .carte {
        largeur: calc (50% - 22px);
      }
    }
    / * Mobiles  * /
    @media (largeur maximale: 640 pixels) {
      .App {
        largeur max: 100%;
        rembourrage: 0 15px;
      }
      .carte {
        largeur: 100%;
      }
    }
    

    Voyons à quoi ressemble notre interface utilisateur YouTube sans l'écran squelette. Vous pouvez voir que lorsque la page se charge, un écran blanc apparaît pendant deux secondes, puis les données se chargent rapidement.

    Interface utilisateur de type YouTube sans écran squelette ( Grand aperçu )

    Utilisation de React Loading Skeleton

    Contrairement aux autres bibliothèques dans lesquelles vous créeriez méticuleusement un écran squelette pour correspondre aux tailles de police, aux hauteurs de ligne et aux marges de votre contenu, le composant Skeleton est conçu pour être utilisé directement dans vos composants, à la place du contenu qui se charge.

    Passons en revue quelques raisons pour lesquelles nous avons choisi React Loading Skeleton sur d'autres.

    Thème

    React Loading Skeleton prend en charge le thème . Ainsi, vous pouvez facilement changer les couleurs de tous les composants du squelette en utilisant SkeletonTheme et passer des valeurs aux accessoires de couleur .

    Ci-dessous un exemple montrant comment cela fonctionne:

     importer Skeleton, {SkeletonTheme} à partir de "react-loading-skeleton";
    
    
      

    Effet thématique en action ( Grand aperçu )

    Durée

    En plus de la hauteur largeur , et accessoires de couleur nous pouvons également spécifier une durée prop.

      
    

    La durée par défaut est de 1.2 . Cela détermine le temps nécessaire pour effectuer un cycle de l'animation du squelette.

    Pour en savoir plus, consultez la documentation .

    Implémentation de l'interface utilisateur de l'écran du squelette

    Maintenant, nous allons installer réagir-chargement-squelette . Exécutez la commande suivante dans votre terminal pour installer le package:

     npm install react-loading-skeleton
    

    Composant squelette

    Créons un composant squelette pour nos données vidéo. Dans notre dossier composants créez un fichier SkeletonCard.js et ajoutez le code suivant:

     import React from "react";
    importer Skeleton à partir de "react-loading-skeleton";
    const SkeletonCard = () => {
        revenir (
          

      {Tableau (9)             .remplir()             .map ((élément, index) => (               
    •                   

    • ))}         
    );   };   exporter SkeletonCard par défaut;

    Nous avons créé une liste non ordonnée. À l'intérieur, nous avons utilisé la méthode Array.fill () . Comme nous avons neuf éléments de données factices, nous avons utilisé la méthode Array.fill () pour parcourir la longueur de notre objet items et l'avons remplie sans valeur d'index, d'où rendant notre tableau vide . Consultez la documentation Array.fill pour en savoir plus sur le fonctionnement.

    Ensuite, nous avons mappé notre tableau vide pour renvoyer une liste contenant les propriétés du squelette et nous avons spécifié la valeur de chacune des propriétés du squelette.

    Ici, hauteur désigne la longueur d'un rectangle squelette et largeur fait référence à la largeur, tandis que le cercle crée la partie arrondie de l'interface utilisateur squelette.

    React Loading Skeleton est livré avec une animation Pulse par défaut, ce qui le rend pratique. Vous pouvez créer une animation Pulse en fonction de votre projet, mais si vous me le demandez, je m'en tiendrai à la valeur par défaut.

    Enfin, le code source complet est disponible .

    Nous avons maintenant un système entièrement fonctionnel UI écran squelette. Notre exemple montre le squelette pendant cinq secondes avant d'afficher le contenu.

    Voyons notre résultat jusqu'à présent:

    Notre interface utilisateur squelette de type YouTube ( Grand aperçu )

    Conclusion

    Les écrans squelettes améliorent considérablement l'expérience utilisateur en évitant la frustration de faire face à un écran entièrement vierge et en donnant à l'utilisateur une impression de ce à quoi ressemblera le contenu avant son chargement.

    Si vous n'êtes pas ' t à l'aise avec l'un des packages que nous avons examinés, vous pouvez créer votre propre interface utilisateur squelette en créant des rectangles et des cercles qui imitent la mise en page.

    Veuillez partager vos commentaires et votre expérience dans la section commentaires ci-dessous. J'adorerais voir ce que vous proposez!

    Le référentiel de soutien pour cet article est disponible sur Github .

    Références

    (ks, il, al )




    Source link
    Quitter la version mobile