Exercices

LocalStorage Weather Api ToDo et LocalStorage

React+ionic

Ionic Create project 4.React Outils utiles 5.Lifecycle Methods 6.JSX

Gestion Ventes

Produit CRUD

6.Form :Ajouter un produit 8.Liste produits 9.Pagination 10.Liste produits +Pagination 11.Liste produits +Datatable 11.Liste produits +load more 12.Supprimer un produit 14.Details d'un produit 15.Recherche et Autocomplete

Reacts:Utils

Gestion des erreurs Variables d'environment Cookies Internationalization proptypes Form validation React Animation Fragment Google Maps

Utilisateur CRUD

18.Inscription upload file 19.Connexion et Les sessions 19.Connexion: JWT Token

Ventes CRUD

17.Vendre un produit 18.Facture Generate PDF 19.Statisques Charts

Redux





Document

Project Details

Exercice : formulaire permettant d'ajouter et de filtrer des contacts.

Auteur : Bilal Zouine

Description : Cet exemple implémente un formulaire permettant d'ajouter et de filtrer des contacts. Il utilise le hook useState pour gérer la liste des contacts, le formulaire, et le filtrage. Le composant permet également de supprimer des contacts de la liste.

Fonctionnalités :
  • Ajouter un contact avec un identifiant unique.
  • Filtrer les contacts par nom.
  • Afficher une liste des contacts ajoutés.
  • Supprimer un contact spécifique à partir de la liste.
Illustration de l'exercice
Code :
                
 



        
import { useState } from "react"

export default function useStateTableau() {
    // Déclaration de l'état pour la liste des contacts
    const [listeContact, setListeContact] = useState([])

    // État pour gérer la valeur du filtre
    const [filter, setFilter] = useState('');

    // État pour stocker les informations d'un nouveau contact
    const [contact, setContact] = useState({
        idContact: 1, // Identifiant unique pour chaque contact
        contact: ''   // Nom du contact
    })

    // Fonction pour ajouter un nouveau contact à la liste
    const ajouterContact = () => {
        // Vérifie que le champ "contact" n'est pas vide
        if (contact.contact !== "") {
            // Ajoute le nouveau contact à la liste existante
            setListeContact(prevListContact => (
                [...prevListContact, contact]
            ))

            // Réinitialise le champ "contact" et incrémente l'ID
            setContact(prevContact => ({
                idContact: contact.idContact + 1,
                contact: ''
            }))
        } else {
            // Alerte si le champ "contact" est vide
            alert('Tous les champs sont obligatoires')
        }
    }

    // Fonction pour supprimer un contact en fonction de son ID
    const Delete = (contactId) => {
        setListeContact(
            listeContact.filter(contact => {
                // Supprime le contact si l'ID correspond
                if (contact.idContact === contactId) {
                    return false
                }
                return true
            })
        )
    }

    return (
        <div className="container mt-5">
            <fieldset className="w-75 mx-auto mb-3 alert alert-info">
                <legend className="text-center">Ajouter un contact</legend>

                <form>
                    <div className="row">
                        {/* Champ pour entrer un nouveau contact */}
                        <div className="form-group col">
                            <label>Nouveau contact</label>
                            <input 
                                type="text" 
                                className="form-control" 
                                name="contact" 
                                onChange={(event) => { 
                                    setContact(prevContact => ({ ...prevContact, contact: event.target.value })) 
                                }} 
                                value={contact.contact} 
                            />
                        </div>

                        {/* Champ pour filtrer les contacts par nom */}
                        <div className="form-group col">
                            <label>Filtrer par Nom</label>
                            <input 
                                type="text" 
                                className="form-control" 
                                name="filter" 
                                onChange={(event) => { setFilter(event.target.value) }} 
                                value={filter} 
                            />
                        </div>
                    </div>

                    <div className="form-group">
                        {/* Bouton pour ajouter un contact */}
                        <input 
                            type="button" 
                            value="Ajouter" 
                            className="btn btn-info fw-bold d-flex mx-auto bt-sm mt-3" 
                            onClick={ajouterContact} 
                        />
                    </div>
                </form>
            </fieldset>

            <h3 className="text-center text-white fw-bold">Liste des contacts</h3>
            <table className="table table-bordered table-sm w-75 mx-auto">
                <thead className="bg-info text-white text-center">
                    <th>Id</th>
                    <th>Contact</th>
                    <th>Action</th>
                </thead>
                <tbody>
                    {/* Filtre et affiche les contacts correspondants */}
                    {
                        listeContact.filter((f) => f.contact.includes(filter)).map((C) => {
                            return (
                                <tr>
                                    <td>{C.idContact}</td>
                                    <td>{C.contact}</td>
                                    <td>
                                        <div className="text-center">
                                            {/* Bouton pour supprimer un contact */}
                                            <button className="btn btn-danger btn-sm" onClick={e => { Delete(C.idContact) }}>
                                                Supprimer
                                            </button>
                                        </div>
                                    </td>
                                </tr>
                            )
                        })
                    }
                </tbody>
            </table>
        </div>
    )
}