One place for hosting & domains

      tableaux

      Comment générer le rendu de tableaux dans React


      Introduction

      Au cours de cet article, vous allez apprendre à générer le rendu d’un tableau dans React et aborder les meilleures pratiques à utiliser pour générer le rendu de différents éléments dans des composants.

      L’un des avantages d’un langage web moderne comme JavaScript, c’est qu’il vous permet d’automatiser rapidement la génération de blocs HTML.

      En utilisant comme une sorte de boucle sur un tableau ou un objet, il vous suffira d’écrire le HTML une seule fois pour chaque élément. Mieux vaut appliquer les futures modifications qu’une seule fois dès maintenant.

      Rendu de plusieurs éléments

      Pour afficher plusieurs éléments JSX dans React, vous pouvez boucler un tableau en utilisant la méthode .map() et renvoyer un seul élément.

      Ci-dessous, vous parcourez le tableau reptiles et retournez un élément li pour chaque article du tableau. Vous pouvez utiliser cette méthode pour afficher un seul élément pour chaque article du tableau :

      function ReptileListItems() {
        const reptiles = ["alligator", "snake", "lizard"];
      
        return reptiles.map((reptile) => <li>{reptile}</li>);
      }
      

      La sortie finale ressemblera à ceci :

      Output

      - alligator - snake - lizard

      Dans l’exemple suivant, vous allez voir les raisons pour lesquelles vous souhaitez ajouter une key unique à une liste d’éléments rendue sous forme d’un tableau.

      Rendu d’un ensemble d’éléments dans un composant

      Dans cet exemple, vous parcourez un tableau et créez une série de composants d’articles de liste comme dans l’exemple précédent.

      Pour commencer, mettez à jour le code pour utiliser le composant <ol> afin de conserver les articles <li>. Le composant <ol> créera une liste des articles classée :

      function ReptileList() {
        const reptiles = ["alligator", "snake", "lizard"];
      
        return (
          <ol>
            {reptiles.map((reptile) => (
              <li>{reptile}</li>
            ))}
          </ol>
        );
      }
      

      Cependant, si vous regardez la console, vous verrez un avertissement signalant que chaque enfant qui se trouve dans un tableau ou un itérateur doit avoir une clé unique.

      Avertissement dans la console

      L’avertissement apparaît car vous devez ajouter une key à chaque fois que vous tentez d’afficher une collection dans un composant.

      Sous React, la key unique sert à déterminer sur quels composants d’une collection un rendu doit être régénéré. En ajoutant une key unique, React n’a pas à régénérer le rendu de l’ensemble du composant à chaque mise à jour.

      Au cours de cette étape, vous allez générer le rendu de plusieurs éléments dans un composant et ajoutez une key unique. Mettez à jour le code pour inclure une key sur les éléments de la liste afin de stopper l’avertissement :

      function ReptileList() {
        const reptiles = ['alligator', 'snake', 'lizard'];
      
        return (
          <ol>
            {reptiles.map(reptile => (
              <li key={reptile}>{reptile}</li>
            ))}
          </ol>
        );
      }
      
      

      Maintenant que vous avez ajouté une key, l’avertissement n’apparaîtra plus dans la console.

      Dans l’exemple suivant, vous allez découvrir de quelle manière générer le rendu des éléments adjacents sans aucune erreur de syntaxe habituelle.

      Rendu des éléments adjacents

      En JSX, pour générer le rendu de plusieurs éléments d’un composant, vous devez les englober dans un habillage.

      Dans cet exemple, vous devez tout d’abord renvoyer une liste des éléments qui n’ont pas été parcourus par un tableau :

      function ReptileListItems() {
        return (
          <li>alligator</li>
          <li>snake</li>
          <li>lizard</li>
        );
      }
      

      Vous verrez apparaître une erreur persistante dans la console :

      Erreur persistante de React sur des éléments JSX adjacents

      Pour corriger cette erreur, il vous faut envelopper le bloc des éléments li dans un habillage. Lorsqu’il s’agit d’une liste, vous pouvez les envelopper dans un élément ol ou ul :

      function ReptileListItems() {
        return (
        <ol>
          <li>alligator</li>
          <li>snake</li>
          <li>lizard</li>
        </ol>
        );
      }
      

      Maintenant, les éléments <li> adjacents sont enveloppés dans une balise fermée, <ol>, et l’erreur a disparu.

      Dans la section suivante, vous allez générer le rendu d’une liste dans un habillage en utilisant un composant fragment.

      Rendu des éléments adjacents avec React.fragment

      Avant React v16.2, vous pouviez habiller un bloc de composants dans un élément <div>. Cela générait une application pleine de divs, souvent appelée “div soup”.

      Pour résoudre ce problème, React a lancé un nouveau composant connu sous le nom de composant fragment :

      Pour générer le rendu d’une liste à l’intérieur d’une balise close tout en évitant d’utiliser une div, utilisez plutôt React.Fragment :

      function ReptileListItems() {
        return (
        <React.Fragment>
           <li>alligator</li>
           <li>snake</li>
           <li>lizard</li>
        </React.Fragment>
        );
      }
      

      Le code rendu comprendra uniquement les éléments li et le composant React.Fragment n’apparaîtra pas dans le code.

      Rendu d'éléments JSX à l'intérieur d'un habillage React.Fragment

      Notez également que vous n’avez pas besoin d’ajouter une clé avec React.fragment.

      Vous remarquerez qu’il est plus fastidieux d’écrire React.fragment que d’ajouter un <div>. Heureusement, l’équipe React a développé une syntaxe plus courte pour représenter ce composant. Vous pouvez utiliser <> </> à la place de <React.Fragment></React.Fragment> :

      function ReptileListItems() {
        return (
       <>
          <li>alligator</li>
          <li>snake</li>
          <li>lizard</li>
       </>
        );
      }
      

      Conclusion

      Cet article vous a permis de découvrir des méthodes de générer le rendu de tableaux dans une application React.

      Lorsque vous générez le rendu d’un élément dans un autre composant, vous devez utiliser une key unique et envelopper vos éléments dans un élément d’habillage.

      En fonction de votre cas d’utilisation, vous pouvez créer des listes simples habillées dans un composant fragment qui n’a pas besoin de clé.

      Pour en savoir plus sur les meilleures pratiques de React, suivez la série complète Comment coder dans React.js mise à votre disposition sur DigitalOcean.



      Source link

      Quatre méthodes de recherche dans les tableaux en JavaScript


      Il existe de nombreux moyens permettant de trouver des objets dans Arrays en JavaScript. Vous pouvez toujours recourir à la basique for pour boucler, mais avec l’ES6+, il existe de nombreuses méthodes pour boucler le tableau et trouver facilement ce dont vous avez besoin.

      Avec autant de méthodes différentes, laquelle utilisez-vous et dans quel cas ? Par exemple, lorsque vous effectuez une recherche dans un tableau, voulez-vous savoir si l’élément se trouve dans le tableau ? Avez-vous besoin de l’index de l’élément ou de l’élément lui-même ?

      Pour chaque méthode différente que nous aborderons, il est important de comprendre qu’il s’agit de méthodes intégrées au prototype Array. Cela signifie que vous devez simplement les enchaîner sur n’importe quel tableau avec la notation par points. Cela signifie également que ces méthodes ne sont pas disponibles sur les objets ou tout autre objet que les Arrays (bien qu’il y ait un chevauchement avec les Strings).

      Nous allons examiner les méthodes Array suivantes :

      includes

      const alligator = ["thick scales", 80, "4 foot tail", "rounded snout"];
      
      alligator.includes("thick scales"); // returns true
      

      La méthode .includes() renvoie une valeur booléenne et est parfaite pour vous indiquer si un élément existe ou non dans un tableau. Elle vous offre simplement réponse true ou false. Ceci est la syntaxe de base :

      arr.includes(valueToFind, [fromIndex]);
      

      Or, comme vous le voyez dans notre exemple, nous n’avions qu’un seul paramètre : la valeur ToFind. C’est la valeur à faire correspondre dans le tableau. L’optionnelle fromIndex est un nombre, indiquant à partir de quel index vous voulez commencer à chercher (la valeur par défaut est 0, donc le tableau entier est inspecté). Ainsi, puisque dans notre exemple, l’élément “thick scales” est à l’index 0, ce qui suit serait faux : alligator.includes('thick scales', 1) ; puisqu’il commence la recherche à partir de l’index 1 et plus.

      Il y a toutefois quelques points importants à noter. Cette méthode .includes() utilise une comparaison stricte. Cela signifie, d’après l’exemple ci-dessus, que le résultat suivant serait faux : alligator.includes('80') ; en effet, si 80 == '80' est vrai, 80 === '80' est faux : les différents types ne se prêtent pas à une comparaison stricte.

      find

      En quoi .find() est-elle différente de la méthode includes() ? Si, dans notre exemple, nous ne modifions que le texte “includes” pour le remplacer par “find”, nous obtiendrons cette erreur :

      Uncaught TypeError: thick scales is not a function
      

      C’est parce que la méthode find nécessite qu’une fonction soit admise. C’est parce que la méthode find ne va pas utiliser un simple opérateur de comparaison comme le fait “includes()”. À la place, il passera chaque élément dans votre fonction et verra si elle renvoie vrai ou faux. Donc, bien que cela fonctionne : alligator.find(() => 'thick scales');, vous voudrez probablement mettre votre propre opérateur de comparaison dans la fonction pour qu’elle renvoie tout ce qui est pertinent.

      const alligator = ["thick scales", 80, "4 foot tail", "rounded snout"];
      
      alligator.find(el => el.length < 12); // returns '4 foot tail'
      

      Cette fonction simple de notre méthode find examine chaque élément du tableau, avec l’alias “el” que nous lui avons attribué, et s’arrête lorsqu’elle trouve le premier élément qui est vrai. Dans notre cas, ce qui est vrai doit avoir une propriété de longueur inférieure à 12 (les nombres n’ont pas de propriété de longueur). Vous pouvez bien sûr rendre cette fonction aussi complexe que nécessaire, en faisant en sorte que votre condition true réponde à vos besoins.

      Remarquez également que cela n’a pas été renvoyé comme true. La méthode find ne renvoie pas un booléen mais le premier élément correspondant. S’il n’y a pas d’élément correspondant – car il n’existe rien qui réponde aux critères définis dans votre fonction – elle renverra undefined. Notez également qu’elle renvoie le premier, donc s’il y a plus d’un élément dans le tableau qui répond aux critères, elle ne prendra que la première instance. Dans notre exemple, s’il y avait une autre chaîne de moins de 12 après “4 feet tall”, cela ne changerait pas notre résultat.

      Dans notre exemple, nous avons utilisé le callback avec un paramètre seulement. Vous pouvez également ajouter des paramètres pour référencer l’index de l’élément en cours. L’ensemble du tableau lui-même peut être un autre paramètre mais je trouve que cela est rarement utilisé. Voici un exemple utilisant l’index :

      alligator.find((el, idx) => typeof el === "string" && idx === 2); // returns '4 foot tall'
      

      Nous savons que, dans notre tableau, 3 éléments différents remplissent la première condition (typeof el === ‘string’). Si c’était notre seule condition, elle nous renverrait la première, “thick scales”. Mais la différence, c’est qu’un seul d’entre eux a un indice de 2 qui signifie “4 foot tall”.

      En parlant d’index,.findIndex() est une méthode de tableau similaire. Cette méthode reçoit également une fonction, mais comme vous pouvez le deviner, elle renvoie l’index de l’élément correspondant au lieu de l’élément lui-même.

      indexOf

      const alligator = ["thick scales", 80, "4 foot tail", "rounded snout"];
      
      alligator.indexOf("rounded snout"); // returns 3
      

      De la même manière que la méthode .includes(), la méthode .indexOf() utilise une comparaison stricte et non une fonction comme nous l’avons vu avec la méthode .find(). Cependant, contrairement à includes(), elle renvoie l’index de l’élément plutôt qu’un booléen. Vous pouvez également indiquer à partir de quel index du tableau la recherche doit débuter.

      Je trouve la méthode indexOf() très utile. Elle est simple et rapide, peut vous dire où se trouve l’élément dans le tableau et peut également vous dire si l’élément existe. Comment vous indique-t-elle si l’élément existe ? Fondamentalement, nous pouvons savoir que l’élément existe si elle renvoie un nombre positif ; si elle renvoie -1, nous savons que l’élément n’existe pas.

      alligator.indexOf("soft and fluffy"); // returns -1
      alligator.indexOf(80); // returns 1
      alligator.indexOf(80, 2); // returns -1
      

      Et comme vous pouvez le voir, bien que nous aurions pu utiliser les méthodes find() ou findIndex() pour obtenir les mêmes informations, celle-ci est beaucoup moins longue à écrire. Nous n’avons pas besoin d’écrire une fonction pour la comparaison, car elle se trouve déjà dans la méthode indexOf.

      Cependant, comme les autres, indexOf() renvoie également l’index du premier élément correspondant qu’elle trouve. JavaScript nous donne une méthode de tableau alternative .lastIndexOf(). Comme vous pouvez le deviner, elle fait la même chose que indexOf() mais en partant du dernier index du tableau et en travaillant à rebours. Vous pouvez également spécifier un second paramètre, mais n’oubliez pas que les index ne changent pas simplement parce que vous utilisez une méthode différente.

      const alligator = ["thick scales", 80, "4 foot tail", "rounded snout", 80];
      
      alligator.indexOf(80); // returns 1
      alligator.lastIndexOf(80); // returns 4
      alligator.indexOf(80, 2); // returns 4
      alligator.lastIndexOf(80, 4); // returns 4
      alligator.lastIndexOf(80, 3); // returns 1
      

      Bonus : filter

      const alligator = ["thick scales", 80, "4 foot tail", "rounded snout", 80];
      
      alligator.filter(el => el === 80); //returns [80, 80]
      

      La méthode filter() est semblable à la méthode find(), en ce sens qu’elle nécessite une fonction passée et une condition pour ce qui sera renvoyé. La principale différence est que filter() renvoie toujours un tableau, même s’il n’y a qu’un seul élément correspondant. Mais elle renvoie tous les éléments correspondants, alors que find() ne renvoie que la première correspondance.

      La chose importante à savoir sur la méthode filter est qu’elle renvoie tous les éléments correspondant à vos critères. Cela ne concerne peut-être que moi, mais il est probable que je m’emmêle les pinceaux en pensant “ce sont les éléments que je veux filtrer en out”, alors qu’en vérité, vous indiquez les éléments que vous souhaitez filtrer en in.

      Conclusion

      D’après moi, la méthode la plus simple à utiliser quand on cherche quelque chose, est la méthode find(), mais comme vous pouvez le voir, cela dépend vraiment de votre cas.

      • Vous avez uniquement besoin de savoir si l’élément existe ? Dans ce cas, utilisez .includes().
      • Vous avez besoin d’obtenir l’élément lui-même ? Utilisez .find() ou .filter() pour plusieurs éléments.
      • Vous avez besoin de trouver l’index de l’élément ? Dans ce cas, utilisez .indexOf() ou findIndex() pour une recherche plus complexe.

      Les tableaux présentés dans les exemples ci-dessus étaient très simples. Vous pourriez vous retrouver avec un tableau d’objects. Voici quelques exemples très simples pour naviguer dans la jungle des objets imbriqués :

      const jungle = [
        { name: "frog", threat: 0 },
        { name: "monkey", threat: 5 },
        { name: "gorilla", threat: 8 },
        { name: "lion", threat: 10 }
      ];
      
      // break the object down in order to use .includes() or .indexOf()
      const names = jungle.map(el => el.name); // returns ['frog', 'monkey', 'gorilla', 'lion']
      console.log(names.includes("gorilla")); // returns true
      console.log(names.indexOf("lion")); // returns 3 - which corresponds correctly assuming no sorting was done
      
      // methods we can do on the array of objects
      console.log(jungle.find(el => el.threat == 5)); // returns object - {name: "monkey", threat: 5}
      console.log(jungle.filter(el => el.threat > 5)); // returns array - [{name: "gorilla", threat: 8}, {name: 'lion', threat: 10}]
      



      Source link