Fermer

août 31, 2021

Un guide rapide des menus déroulants avec React


Vous rencontrez probablement encore plus de listes déroulantes que vous ne le pensez. Explorons certains des types de listes déroulantes que vous pouvez utiliser lors de la création de votre prochaine application React.

Les listes déroulantes sont une fonctionnalité commune à de nombreux sites Web. Ils sont très utiles, car ils permettent d'afficher facilement des données supplémentaires uniquement lorsque cela est nécessaire. Par exemple, si nous voulons qu'un utilisateur sélectionne son pays d'origine, une liste de pays ne sera pas visible tant qu'un utilisateur n'aura pas cliqué sur la liste déroulante des pays. Un autre bon exemple est la fonctionnalité de saisie semi-automatique. Lorsqu'un utilisateur recherche un élément, vous pouvez afficher une liste déroulante avec une liste de suggestions qui peuvent aider à effectuer la recherche plus rapidement.

Explorons certains des types de listes déroulantes que vous pouvez utiliser dans votre application.

Types de listes déroulantes

Vous rencontrez probablement un tas de listes déroulantes dans votre vie quotidienne, que vous y pensiez ou non.

Par exemple, l'utilisation de la barre de recherche Google fera apparaître une liste déroulante de saisie semi-automatique :

Si vous saisissez "Où devrais-je" dans Google, des suggestions s'affichent, notamment "Je mange", "Je vis"

De même, YouTube utilise une liste déroulante de saisie semi-automatique pour afficher des suggestions de vidéos :

YouTube propose une recherche de vidéos. la saisie semi-automatique avec des suggestions pertinentes.

La saisie semi-automatique n'est pas la seule fonctionnalité pour laquelle des listes déroulantes sont utilisées. Par exemple, de nombreux sites Web utilisent des listes déroulantes pour leur navigation, comme Target :

La barre de navigation du site Web Target. Un clic sur Quoi de neuf ouvre un menu déroulant avec #targetstyle, les nouveautés femme, les nouveautés beauté, etc.

Si une simple navigation déroulante ne suffisait pas, il existe des sites Web qui intègrent des méga menus déroulants. Ceux-ci sont souvent utilisés par les sites Web de commerce électronique qui peuvent contenir de nombreux liens vers des catégories et des produits. L'un d'eux est Asda :

La liste déroulante de méga navigation du site Web d'Asda. Le survol de l'une des catégories ouvrira des sous-catégories.

Un autre exemple est un menu déroulant contextuel. Facebook l'utilise pour proposer aux utilisateurs des actions liées aux publications :

Facebook propose un menu déroulant contextuel pour les publications avec différentes options de menu. Les listes déroulantes peuvent afficher différentes options en fonction du type de publication, telles qu'une publication utilisateur standard, une image, une vidéo ou une publicité.

Il existe de nombreux autres exemples de listes déroulantes, mais voyons maintenant comment implémentez des exemples concrets dans votre code.

Création avec des listes déroulantes

Dans cet article, nous couvrirons plusieurs exemples de listes déroulantes et de composants de formulaire React. J'utiliserai KendoReactqui fournit un certain nombre de composants très utiles et riches en fonctionnalités. Nous allons implémenter des menus déroulants et sélectionner des composants pour des cas d'utilisation réels à l'aide de ces composants :

Vous pouvez voir ci-dessous ce que nous allons construire dans le CodeSandbox interactif.

Configuration du projet

Commençons par configurer un nouveau React projet. Pour en créer rapidement un, vous pouvez utiliser Create React App ou Vite. Pour cette démo, nous allons utiliser Create React App. Vous pouvez créer un projet React en exécutant l'une des commandes ci-dessous dans votre terminal.

npx create-react-app my-kendo-react-dropdowns
cd my-kendo-react-dropdowns
npm start // ou début du fil

Nous devons maintenant installer quelques packages nécessaires à l'utilisation des listes déroulantes KendoReact.

Remarque : KendoReact est une bibliothèque commerciale de composants d'interface utilisateur. vous utilisez les composants dans vos projets React. Vous pouvez obtenir une clé de licence via un essai gratuit ou en possédant une licence commerciale. Pour plus d'informations, vous pouvez vous rendre sur la page KendoReact Licensing.

// npm
npm install --save @progress/kendo-react-dropdowns @progress/kendo-react-treeview @progress/kendo-react-animation @progress/kendo-react-intl @progress/kendo-react-data-tools @progress/ kendo-react-common @progress/kendo-data-query @progress/kendo-react-buttons @progress/kendo-react-dateinputs @progress/kendo-react-inputs @progress/kendo-drawing @progress/kendo-licensing @ progression/kendo-theme-default
  
// fil
fil ajouter @progress/kendo-react-dropdowns @progress/kendo-react-treeview @progress/kendo-react-animation @progress/kendo-react-intl @progress/kendo-react-data-tools @progress/kendo-react -common @progress/kendo-data-query @progress/kendo-react-buttons @progress/kendo-react-dateinputs @progress/kendo-react-inputs @progress/kendo-drawing @progress/kendo-licensing @progress/kendo -theme-default

Après avoir installé les packages, faisons un petit nettoyage. Vous pouvez remplacer les styles du fichier App.css et le contenu du fichier App.js par le code ci-dessous.

src/App.js

import  '@progress/kendo-theme-default/dist/all.css';  
import "./App.css";  
fonction App[19659030]() {  
  return <div className="App"> </div>;  
}  
  
export default App;

src/App.css

.App {  
  max-width: 40rem;  
  margin[19659030]: 2rem auto;  
}

Voilà pour la configuration du projet. Implémentons la première liste déroulante.

React DropDownList

Imaginez un site Web de recettes qui permet aux utilisateurs de rechercher des recettes, des vidéos et des articles liés à la nourriture. Un utilisateur doit pouvoir filtrer les résultats en fonction de la catégorie. La création d'une liste déroulante de catégories avec KendoReact est très simple.

Nous aurons besoin de deux tableaux, un pour stocker les catégories et le second avec des données qui seront filtrées par la catégorie sélectionnée. Deux éléments principaux seront rendus : le composant DropDownList qui affichera une liste des catégories disponibles et les résultats filtrés. Ci-dessous, vous pouvez voir le code du composant RecipeDropDownList.

src/components/DropDownList/RecipeDropDownList.js

import { useMemo[1945900342]] useState } from "react";  
import { DropDownList } from "@progress/kendo-react -dropdowns";  
  

const categories = ["all", "recette", "video"[19659030], "article"];  
  
  

const données = [  
  {
    identifiant: 1,
    étiquette : "Meilleur Ramen jamais",
    tapez: "recette",  
  },  
  {
    identifiant: 2,
    label : "Top 10 plats mexicains",
    tapez: "article",  
  },  
  {
    identifiant: 3,
    label : "Comment préparer un poulet entier rôti",
    tapez: "vidéo",  
  },  
  {
    identifiant: 4,
    étiquette : "Gnocchis de poulet au piment",
    tapez: "recette",  
  },  
  {
    identifiant: 5,
    label : "Les 5 meilleurs desserts glacés pour un été chaud",
    tapez: "article",  
  },  
];  
  
export const RecipeDropDownList =  () => {  
  
  const [category, setCategory] = useState( "");  
  
  
  
  const filteredData = useMemo(() => {   
    if (!catégorie || catégorie === "all") return data;  
  
    return data.filter(item => item.type ===  catégorie);  
}, [catégorie]);  
  

  retour ([19659176]<section classe Nom="k-my-8">
      <form className="k-form k-mb-4">
        <label className="k-label k-mb- 3">Catégorie</label>
        <DropDownList data={catégories} onChange={e => setCategory(e. valeur)} />
      </form>

      <section className="k-listgroup">
        <ul>[19659191]
          {filteredData.map(item => {
            return (
              <li key={item.id} className= "k-listgroup-item">
                {article.libellé}
              </li>
            );
          })}
        </ul>
      </section>
    </section>
  );
};

Vous pouvez maintenant l'ajouter dans le fichier App.js.

src/App.js

import "@progress/kendo-theme-default/dist /all.css";  
import "./App.css";  
import { RecipeDropDownList } from  "./components/DropDownList/RecipeDropDownList";  
  
fonction App() {  
  retour (
    <div className="App">
      <RecipeDropDownList />
    </div>  
  );  
}  
  
export default App;

Ci-dessous, vous pouvez voir la liste déroulante de la recette en action.

Recipe DropDownList comprend tous les éléments, la recette, la vidéo et l'article

React MultiSelect

MultiSelect, comme son nom l'indique, est une liste déroulante de sélection qui permet à un utilisateur de sélectionner plusieurs éléments. Dans l'exemple précédent, nous avons créé une liste déroulante de sélection qui permet à un utilisateur de sélectionner une catégorie.

Cependant, il existe des scénarios dans lesquels il est utile de permettre aux utilisateurs de sélectionner plusieurs éléments. Par exemple, une plateforme de blog technologique pourrait permettre à un rédacteur technique de sélectionner des technologies liées à un article. Il suffit de regarder cet article. Si je devais spécifier des balises pour cela, je choisirais probablement les balises JavaScript, React et KendoReact. Maintenant, implémentons un multiselect.

src/components/MultiSelect/TagsMultiSelect.js

import { MultiSelect } from "@progress/kendo -react-dropdowns";  
import { useState } from "react";  
  
const tags  = [  
  "JavaScript",  
  "TypeScript",  
  "React",  
  "Suivant",  
  "Vue ",  
  "Nuxt",  
  "Node",  
  "Python",  
];  
  
export  const TagsMultiSelect = () => {  
  const [selectedTags, setSelectedTags]  = useState([]);  
  const onChange = événement =>[19659035]setSelectedTags([...événement.value]);  
  
  return (
    <form className="k-form k-my-8">
      <label className="k-label k-mb-3">Technologies associées </étiquette>
      <MultiSelect data={tags} value={selectedTags } onChange={onChange} autoClose={faux}  />
    </form>  
  );  
};

Encore une fois, mettez à jour le fichier App.js pour rendre notre composant TagsMultiSelect.

src/App.js


import { TagsMultiSelect } from "./components/MultiSelect/TagsMultiSelect";  
  
function App() {  
  retour  (
    <div className="App">
      { }
      <TagsMultiSelect />
    </div>  
  );  
}  
  
export default App;

Dans le gif ci-dessous, vous pouvez voir le composant TagsMultiSelect en action.

MultiSelect permet à l'utilisateur de sélectionner plusieurs balises dans une liste déroulante : JavaScript, React, Vue, Node. Et chacun a un X qui lui permet d'être supprimé de la sélection.

React AutoComplete

Il existe de nombreux sites Web qui demandent aux utilisateurs de fournir leurs informations personnelles et leur lieu de résidence. Très souvent, un formulaire comme celui-ci contient une liste déroulante qui permet aux utilisateurs de sélectionner le pays dans lequel ils vivent. Tout d'abord, créez un nouveau fichier qui contiendra tous les pays.

src/components/AutoComplete/countries.js[19659414]export const pays = [
{ label: "Andorre" },
{ étiquette: "Emirats Arabes Unis" },


{ étiquette: "Zambie" },
{ étiquette: "Zimbabwe" },
];

Utilisons ces pays et créons un nouveau composant React AutoComplete.

src/components/AutoComplete/CountryAutoComplete.js

import { pays }[19659050]from "./countries";  
import { Saisie semi-automatique } from "@progress/kendo-react-dropdowns" ;  
  
export const CountryAutoComplete = () => {  
  return (
    <form className="k-form k-my-8">
      <label className="k-label k-mb-3">Sélectionnez le pays </étiquette>
      <Saisie semi-automatique data={pays} textField="label " suggérer />
    </form>  
  );  
};

Maintenant, nous pouvons rendre le CountryAutoComplete dans le fichier App.js.

src/App.js


import { CountryAutoComplete } from './components/AutoComplete/CountryAutoComplete'  
  
function App() {  
  return (
    <div className="App">
      { }
      <PaysAutoComplete />
    </div>  
  );  
}  
  
export default App;

Vous pouvez voir ci-dessous le composant de saisie semi-automatique du pays en action.

La saisie semi-automatique affiche des suggestions connexes dans un menu situé sous le champ de saisie. Comme l'utilisateur tape

React ComboBox

Le composant ComboBox est assez similaire au composant DropDownList que nous avons utilisé précédemment mais permet aux utilisateurs de le saisir. Il fournit également des fonctionnalités supplémentaires, telles que le regroupement et les suggestions.

Prenons l'exemple d'un logiciel de gestion de projet. Lors de la création d'une nouvelle tâche, vous pouvez l'affecter à un employé de votre entreprise. Cependant, si votre entreprise a beaucoup d'employés, il serait utile de voir dans quel département ils se trouvent, il est donc plus facile de trouver des cessionnaires.

src/components/ComboBox/AssignessComboBox.js

import[19659038]{ ComboBox } from "@progress/kendo-react-dropdowns";
import { useState }[19659050]de "react";

const cessionnaires = [
  {
    identifiant: 1,
    nom : "Chloe Williams",
    profession : "Développeur",
  },
  {
    identifiant: 2,
    nom : "Severus Rogue",
    profession : "Développeur",
  },
  {
    identifiant: 3,
    nom : "Mark Smith",
    profession : "Support technique",
  },
  {
    identifiant: 4,
    nom : "Rosemary Adams",
    profession : "Support technique",
  },
  {
    identifiant: 5,
    nom : "Joe McDonalds",
    profession: "Designer",
  },
  {
    identifiant: 6,
    nom : "Minerva McGonagall",
    profession: "Designer",
  },
];

export const AssignéesComboBox =  () => {
  const [selectedAssignee, setSelectedAssignee] = useState( null);
  const onChange = événement => setSelectedAssignee(event.value);

  return (
    <form className="k-form k-my-8 ">
      <label className="k-label k-mb-3"[19659030]>Task Assignee</label>
      <ComboBox
        data={assignees}[19659191]
        value={destinataire sélectionné}
        onChange={onChange}
        textField="nom"
        Champ de groupe="occupation"
        suggérer
      />
    </formulaire>
  );
};

Encore une fois, n'oubliez pas de l'ajouter au composant App.js.

src/App.js


import { AssigneesComboBox } de "./components/ComboBox/AssignesComboBox";  
  
fonction App() {  
  retour ( 
    <div className="App">
      { }
      <CessionnairesComboBox />
    </div>  
  );  
}  
  
export default App;

Ci-dessous, vous pouvez voir comment cela fonctionne. Notez les étiquettes « Développeur », « Designer » et « Support technique ». fonctionne comme le ComboBox que nous avons implémenté dans la section précédente, mais il peut afficher plusieurs colonnes dans la liste déroulante. Améliorons l'exemple d'assigné de tâche précédent et affichons tous les détails : « id », « nom » et « occupation » dans la liste déroulante.

src/components/MultiColumnComboBox/AssigneesMultiColumnComboBox.js

import {  MultiColumnComboBox } de "@progress/kendo-react-dropdowns";
import { useState } de[19659029]"réagir";

const cessionnaires = [
  {
    identifiant: 1,
    nom : "Chloe Williams",
    profession : "Développeur",
  },
  {
    identifiant: 2,
    nom : "Severus Rogue",
    profession : "Développeur",
  },
  {
    identifiant: 3,
    nom : "Mark Smith",
    profession : "Support technique",
  },
  {
    identifiant: 4,
    nom : "Rosemary Adams",
    profession : "Support technique",
  },
  {
    identifiant: 5,
    nom : "Joe McDonalds",
    profession: "Designer",
  },
  {
    identifiant: 6,
    nom : "Minerva McGonagall",
    occupation: "Designer",
  },
];

const colonnes = [
   {
    champ: "id",
    en-tête : "ID",
    largeur: "9rem",
  },
  {
    champ : "nom",
    en-tête : "Nom",
    largeur: "15rem",
  },
  {
    champ : "profession",
    en-tête : "Occupation",
    width: "15rem",
  },
];

export const AssignéesMultiColumnComboBox =  () => {
  const [selectedAssignee, setSelectedAssignee] = useState( null);
  const onChange = événement => setSelectedAssignee(event.value);

  return (
    <form className="k-form k-my-8 ">
      <label className="k-label k-mb-3"[19659030]>Destinataire de la tâche MultiColumn</label>
      <MultiColumnComboBox
        data={a signataires}
        colonnes={colonnes}
        value={destinataire sélectionné}
        onChange={onChange}
        textField="nom"
        suggérer
      />
    </formulaire>
  );
};

src/App.js


import { AssigneesMultiColumnComboBox } from "./components/MultiColumnComboBox/AssignesMultiColumnComboBox]; ". function App() {
  return (
    <div className="App">
      { }
      <AffectésMultiColumnComboBox />
    </div>
  );
}

export default App;

La liste déroulante MultiColumnComboBox de l'assigné de la tâche comporte désormais des colonnes avec l'ID, le nom et l'occupation

React DropDownTree

Le dernier mais non le moindre est le composant React DropDownTree. Il peut être utilisé pour choisir une valeur unique dans une liste hiérarchique. Ce qui est vraiment intéressant à propos de ce composant, cependant, c'est qu'il peut être utilisé pour afficher une liste d'articles pliables et extensibles.

Imaginez un site Web d'épicerie qui permet à un administrateur d'attribuer des aliments à des catégories spécifiques. Par exemple, un administrateur pourrait ouvrir une liste déroulante de sélection contenant différentes catégories telles que les boissons et les aliments réfrigérés, ainsi que des sous-catégories telles que l'eau, le jus ou le fromage. C'est quelque chose que nous pouvons implémenter avec le composant DropDownTree.

La sélection de catégories d'aliments avec DropDownTree affiche la liste déroulante avec des sous-titres de style accordéon. Lorsque l'utilisateur clique sur la liste déroulante, il existe trois catégories : les catégories Boissons, Sans et Aliments réfrigérés. L'ouverture de l'une des catégories ouvre une liste avec les éléments individuels qui peuvent être sélectionnés. Si un élément est sélectionné puis retiré de la sélection, le menu a toujours la catégorie ouverte, donc la vue est persistante.

Voici l'implémentation. Cela nécessite un peu plus de code que les exemples précédents et nous devons utiliser quelques méthodes d'assistance pour gérer l'état étendu et traiter les données de l'arborescence déroulante.

src/components/DropDownTree/FoodDropDownTree.js

import[19659038]{ useCallback, useMemo, useState } from "react";
import { DropDownTree } from "@progress/kendo-react-dropdowns";
import { processTreeData,ExpandedState  } from "./treeDataOperations";

const data = [
  {
    identifiant: 1,
    texte : "Boissons",
    articles : [
      {
        identifiant: 2,
        texte: "Eau",
      },
      {
        identifiant: 3,
        texte: "Jus",
      },
      {
        identifiant: 4,
        texte : "Café et thé",
      },
    ],
  },
  {
    identifiant: 5,
    texte : "Libre de",
    articles : [
      {
        identifiant: 6,
        texte : "Sans gluten",
      },
      {
        identifiant: 7,
        texte : "Sans produits laitiers",
      },
      {
        identifiant: 8,
        texte : "Sans lactose",
      },
    ],
  },
  {
    identifiant: 9,
    texte : "Nourriture réfrigérée",
    articles : [
      {
        identifiant : 10,
        texte : "Fromage",
      },
      {
        identifiant: 11,
        texte: "Viande cuite",
      },
      {
        id: 12,
        text: "Ready Meals",
      },
    ],
  },
];

const selectField = "selected";
const expandField = "expanded";
const dataItemKey = "id";
const textField = "text";
const subItemsField = "items";
const fields = {
  selectField,
  expandField,
  dataItemKey,
  subItemsField,
};

export const FoodDropDownTree = () => {
  const [value, setValue] = useState(null);
  const [expanded, setExpanded] = useState([]);

  const onChange = event => setValue(event.value);

  const onExpandChange = useCallback(
    event => setExpanded(expandedState(event.item, dataItemKey, expanded)),
    [expanded]
  );

  const treeData = useMemo(
    () =>
      processTreeData(
        data,
        {
          expanded,
          value,
        },
        fields
      ),
    [expanded, value]
  );

  return (
    <form className="k-form k-my-8">
      <label className="k-label k-mb-3">Select Food Category</label>
      <DropDownTree
        data={treeData}
        textField={textField}
        onChange={onChange}
        dataItemKey={dataItemKey}
        selectField={selectField}
        expandField={expandField}
        onExpandChange={onExpandChange}
      />
    </form>
  );
};

src/components/DropDownTree/treeDataOperations.js

import { filterBy } from "@progress/kendo-react-data-tools";
import { mapTree, extendDataItem } from "@progress/kendo-react-common";

export const processTreeData = (data, state, fields) => {
  const { selectField, expandField, dataItemKey, subItemsField } = fields;
  const { expanded, value, filter } = state;
  const filtering = Boolean(filter && filter.value);

  return mapTree(
    filtering ? filterBy(data, [filter], subItemsField) : data,
    subItemsField,
    item => {
      const props = {
        [expandField]: expanded.includes(item[dataItemKey]),
        [selectField]: value && item[dataItemKey] === value[dataItemKey],
      };
      return filtering
        ? extendDataItem(item, subItemsField, props)
        : { ...item, ...props };
    }
  );
};

export const expandedState = (item, dataItemKey, expanded) => {
  const nextExpanded = expanded.slice();
  const itemKey = item[dataItemKey];
  const index = expanded.indexOf(itemKey);
  index === -1 ? nextExpanded.push(itemKey) : nextExpanded.splice(index, 1);

  return nextExpanded;
};

Lastly, add the component in the App.js file.

src/App.js


import { FoodDropDownTree } from "./components/DropDownTree/FoodDropDownTree";

function App() {
  return (
    <div className="App">
      { }
      <FoodDropDownTree />
    </div>
  );
}

export default App;

Wrap-up

That’s it! I hope you enjoyed this quick guide to dropdown menus with React. There are many use cases for dropdowns, and they are one of the most commonly used features on the web. We have covered how commonly used websites incorporate dropdowns and implemented six different React dropdown examples for real-life scenarios.

KendoReact offers a lot of feature-rich components that can be easily used for implementing a variety of features. Make sure to check out the React DropDowns documentation for more examples. You can find the full code for this tutorial in this GitHub repo.




Source link