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





React:State(Formulaire)

Créer un formulaire d'inscription d'un étudiant

npx crcf components/Formulaire

Formulaire.js

import React from "react";
class Formulaire extends React.Component{
    constructor(props)
    {
        super(props)
        this.state={
            //un objet qui permet de stocker les valeurs d'un stagiaire
            stagiaire:{
                nom:'',
                prenom:''
            },
            //stocker et afficher la liste des stagiaires ajouté
            listeStagiaires:[]  
        }
       
       
    }
   
    //récupéer la valeur de l'input changé la stocké dans la variable du state stagiaire
    //event : un objet qui contient des information sur l'objet DOM changé comme:
    //event.target.value,event.target.name,.....
    getValue=(event)=>{
        this.setState({
            stagiaire:{
                ...this.state.stagiaire,//permet de récupérer les autres attributs de l'objet stagiaire
                [event.target.name]:event.target.value
                //[event.target.name]:permet de récupéer le nom de l'input qui est change
                //qui peut etre soit nom ou prenom
               
            }
        })
       
    }
   
    //ajouter un nouveau stagiaire dans la variable du state listeStagiaires
    ajouterStagiaire=(event)=>{
        //vérifier si tout les champs sont remplis
        if(this.state.stagiaire.nom!='' && this.state.stagiaire.prenom!='')
        {
        //changer la valeur du state afin d'ajouter un nouveau stagiaire
        this.setState({
            listeStagiaires:[...this.state.listeStagiaires,this.state.stagiaire]
            //...this.state.listeStagiaires: récupéer la listes des stagiaire déja ajouter puis ajouté
               //un nouveau stagiaire
        })
    }
}
   
   
    render(){
        return(<div>
            <table>
            <tr>
            <td>Nom</td>
            <td><input type="text" name="nom" onChange={this.getValue}/></td>
            </tr>
            <tr>
            <td>Prénom</td>
            <td><input type="text" name="prenom" onChange={this.getValue}/></td>
            </tr>
            <tr>
            <td></td>
            <td><input type="button" value="Ajouter" onClick={this.ajouterStagiaire}/></td>
            </tr>
            </table>
           
            <b>liste stagiaires</b>
            <table>
            <thead>
            <th>Nom</th>
            <th>Prénom</th>
            </thead>
            <tbody>
            {
                this.state.listeStagiaires.map((str) =>{
                    return(<tr>
                        <td>{str.nom}</td>
                        <td>{str.prenom}</td>
                        </tr>)
                    })  
                }
                </tbody>
                </table>
                </div>)
            }
        }
        export default Formulaire

App.js

  import React from 'react';
  import './App.css';
import Formualire from './components/formualire/formualire';
  class  App extends React.Component{
    constructor(props)
    {
      super(props);
     
    }
   
    render()
    {
      return (
        <div>
        <Formualire />
        </div>
        );
      }
    }
    export default App;
npm start
Solution 2

 import React ,{Component} from "react";
class StagiaireCrud extends Component
{
    constructor()
    {
        super();
        this.state={
            stagiaire:{
                nom:'',
                prenom:'',
                age:''
            },
           
            listeStagiaires:[],
            modifierIsOn:false,
            indexStagiaireAmodifier:-1
        }
    }

        getValue=(event)=>{

            this.setState({

               stagiaire:{
                ...this.state.stagiaire,
                [event.target.name]:event.target.value

               }


            })
        }
    

        ajouterStagiaire=()=>{
            this.setState({
                listeStagiaires:[...this.state.listeStagiaires,this.state.stagiaire],
                stagiaire:{
                    nom:'',
                    prenom:'',
                    age:''
                }
            })
        }


    supprimerStagiaire=(i)=>{
        this.setState({
            listeStagiaires:[...this.state.listeStagiaires.filter((sta,index)=>index!=i)]
        
        })
    }

    modifierStagiaire=(stag,index)=>{
      this.setState({
        stagiaire:stag,
        modifierIsOn:true,
        indexStagiaireAmodifier:index
      })
    }

    validerModifier=()=>{
const liseModifier=this.state.listeStagiaires;
liseModifier[this.state.indexStagiaireAmodifier]=this.state.stagiaire;
this.setState({
    listeStagiaires:liseModifier,
    modifierIsOn:false,
    indexStagiaireAmodifier:-1

})


    }
  
    render()
    {
        return(<div>
          Nom:  <input type="text" name="nom" value={this.state.stagiaire.nom} onChange={this.getValue}/><br/>
          Prénom:  <input type="text" name="prenom" value={this.state.stagiaire.prenom} onChange={this.getValue}/><br/>
          Age:  <input type="number" name="age" value={this.state.stagiaire.age} onChange={this.getValue}/><br/>
         
      
         {
            (this.state.modifierIsOn) ? (
<input type="button" value="Modifier" onClick={this.validerModifier}></input>
            ):(
 <input type="button" onClick={this.ajouterStagiaire} value="Ajouter"></input>
            )
        }

<table>
    <thead>
    <th>Nom</th>
    <th>Prénom</th>
    <th>Age</th>
    <th>Actions</th>
    </thead>
    <tbody>
    {
        this.state.listeStagiaires.map((sta,index)=>{
            return(<tr key={index}>
                <td>{sta.nom}</td>
                <td>{sta.prenom}</td>
                <td>{sta.age}</td>
                <td>
                    <input type="button" onClick={()=>this.supprimerStagiaire(index)} value="Supprimer"/>
                    <input type="button" onClick={()=>this.modifierStagiaire(sta,index)} value="Modifier"/>
                   </td>
            
            </tr>)
        })
    }
    </tbody>
</table>
        </div>)
    }
}
export default StagiaireCrud;
 
 
Avec Component de type function

import React, { useState } from "react";

function StagiaireCrud() {

    // ==============================
    // State du stagiaire
    // ==============================

    const [stagiaire, setStagiaire] = useState({
        nom: '',
        prenom: '',
        age: ''
    });


    // ==============================
    // Liste des stagiaires
    // ==============================

    const [listeStagiaires, setListeStagiaires] = useState([]);


    // ==============================
    // Indique si nous sommes
    // en mode modification
    // ==============================

    const [modifierIsOn, setModifierIsOn] = useState(false);


    // ==============================
    // Index du stagiaire à modifier
    // ==============================

    const [indexStagiaireAmodifier, setIndexStagiaireAmodifier] = useState(-1);


    // =========================================================
    // Récupérer la valeur saisie dans les inputs
    // =========================================================

    const getValue = (event) => {

        setStagiaire({
            ...stagiaire,
            [event.target.name]: event.target.value
        });

    };


    // =========================================================
    // Ajouter un nouveau stagiaire
    // =========================================================

    const ajouterStagiaire = () => {

        setListeStagiaires([
            ...listeStagiaires,
            stagiaire
        ]);

        // Réinitialiser le formulaire
        setStagiaire({
            nom: '',
            prenom: '',
            age: ''
        });

    };


    // =========================================================
    // Supprimer un stagiaire
    // =========================================================

    const supprimerStagiaire = (index1) => {

        setListeStagiaires(
            listeStagiaires.filter((sta, index) => index !== index1)
        );

    };


    // =========================================================
    // Charger un stagiaire dans le formulaire
    // pour le modifier
    // =========================================================

    const modifierStagiaire = (stag, index) => {

        setStagiaire({
            ...stag
        });

        setModifierIsOn(true);

        setIndexStagiaireAmodifier(index);

    };


    // =========================================================
    // Valider la modification
    // =========================================================

    const validerModifier = () => {

        // Créer une nouvelle liste
        const listeModifiee = [...listeStagiaires];

        // Remplacer l'ancien stagiaire
        listeModifiee[indexStagiaireAmodifier] = stagiaire;

        // Mettre à jour la liste
        setListeStagiaires(listeModifiee);

        // Quitter le mode modification
        setModifierIsOn(false);

        // Réinitialiser l'index
        setIndexStagiaireAmodifier(-1);

        // Réinitialiser le formulaire
        setStagiaire({
            nom: '',
            prenom: '',
            age: ''
        });

    };


    // =========================================================
    // JSX
    // =========================================================

    return (
        <div>

            {/* =========================
                Formulaire
            ========================= */}

            Nom :
            <input
                type="text"
                name="nom"
                value={stagiaire.nom}
                onChange={getValue}
            />

            <br />

            Prénom :
            <input
                type="text"
                name="prenom"
                value={stagiaire.prenom}
                onChange={getValue}
            />

            <br />

            Age :
            <input
                type="number"
                name="age"
                value={stagiaire.age}
                onChange={getValue}
            />

            <br />


            {/* =========================
                Bouton Ajouter / Modifier
            ========================= */}

            {
                modifierIsOn ? (

                    <input
                        type="button"
                        value="Modifier"
                        onClick={validerModifier}
                    />

                ) : (

                    <input
                        type="button"
                        value="Ajouter"
                        onClick={ajouterStagiaire}
                    />

                )
            }


            {/* =========================
                Tableau
            ========================= */}

            <table>

                <thead>

                    <tr>
                        <th>Nom</th>
                        <th>Prénom</th>
                        <th>Age</th>
                        <th>Actions</th>
                    </tr>

                </thead>


                <tbody>

                    {
                        listeStagiaires.map((sta, index) => {

                            return (

                                <tr key={index}>

                                    <td>
                                        {sta.nom}
                                    </td>

                                    <td>
                                        {sta.prenom}
                                    </td>

                                    <td>
                                        {sta.age}
                                    </td>

                                    <td>

                                        {/* Supprimer */}

                                        <input
                                            type="button"
                                            value="Supprimer"
                                            onClick={() =>
                                                supprimerStagiaire(index)
                                            }
                                        />


                                        {/* Modifier */}

                                        <input
                                            type="button"
                                            value="Modifier"
                                            onClick={() =>
                                                modifierStagiaire(sta, index)
                                            }
                                        />

                                    </td>

                                </tr>

                            );

                        })
                    }

                </tbody>

            </table>

        </div>
    );
}

export default StagiaireCrud;
Exemple 2

Dans cet exemple, nous allons créer une application qui permet à l'utilisateur de saisir son nom et d'afficher un message de bienvenue.

import React, { Component } from 'react';

class WelcomeApp extends Component {
  constructor(props) {
    super(props);
    this.state = {
      name: '',
      message: '',
    };
  }

  funChange = (event) => {
    this.setState({
      name: event.target.value,
    });
  }

  funSubmit = (event) => {
    event.preventDefault();
    const message = `Bienvenue, ${this.state.name} !`;
    this.setState({
      message,
    });
  }

  render() {
    return (
	  <div>
        <h1>Simple Application with this.state and Form</h1>
        <form onSubmit={this.funSubmit}>
          <label>
            Entrez votre nom : 
            <input type="text" value={this.state.name} onChange={this.funChange} />
          </label>
          <button type="submit">Envoyer</button>
        </form>
        <div>
          {this.state.message && <p>{this.state.message}</p>}
        </div>
      </div>
    );
  }
}

export default WelcomeApp;
Exemple 3

Dans cet exemple, nous allons créer une application de liste de tâches où l'utilisateur peut ajouter et supprimer des tâches.

import React, { Component } from 'react';

class TodoApp extends Component {
  constructor(props) {
    super(props);
    this.state = {
      tasks: [],
      newTask: '',
    };
  }

  funChange = (event) => {
    this.setState({
      newTask: event.target.value,
    });
  }

  funSubmit = (event) => {
    event.preventDefault();
    if (this.state.newTask.trim() !== '') {
      this.setState({
        tasks: [...this.state.tasks, this.state.newTask],
        newTask: '',
      });
    }
  }

  funDelete = (index) => {
    const updatedTasks = [...this.state.tasks];
    updatedTasks.splice(index, 1);
    this.setState({
      tasks: updatedTasks,
    });
  }

  render() {
    return (
      <div>
        <h1>Todo List</h1>
        <form onSubmit={this.funSubmit}>
          <input
            type="text"
            value={this.state.newTask}
            onChange={this.funChange}
            placeholder="Ajouter une tâche"
          />
          <button type="submit">Ajouter</button>
        </form>
        <ul>
          {this.state.tasks.map((task, index) => (
            <li key={index}>
              {task}
              <button onClick={() => this.funDelete(index)}>Supprimer</button>
            </li>
          ))}
        </ul>
      </div>
    );
  }
}

export default TodoApp;
Exemple 4

une application de conversion de devises qui permet à l'utilisateur de saisir une valeur en dollars américains (USD) et de la convertir en euros (EUR) en utilisant un taux de change fixe.

import React, { Component } from 'react';

class CurrencyConverter extends Component {
  constructor(props) {
    super(props);
    this.state = {
      usdAmount: '',
      eurAmount: '',
      exchangeRate: 0.85, // Taux de change USD vers EUR
    };
  }

  funUsdAmountChange = (event) => {
    this.setState({
      usdAmount: event.target.value,
    });
  }

  convertCurrency = () => {
    const usdAmount = parseFloat(this.state.usdAmount);
    if (!isNaN(usdAmount)) {
      const eurAmount = usdAmount * this.state.exchangeRate;
      this.setState({
        eurAmount: eurAmount.toFixed(2), // Arrondir à deux décimales
      });
    }
  }

  render() {
    return (
      <div>
        <h1>Currency Converter</h1>
        <label>
          USD:
          <input
            type="number"
            value={this.state.usdAmount}
            onChange={this.funUsdAmountChange}
          />
        </label>
        <button onClick={this.convertCurrency}>Convert</button>
        <p>EUR: {this.state.eurAmount}</p>
      </div>
    );
  }
}

export default CurrencyConverter;
Exercice

Créer une application de gestions des joueurs de chaque équipe


 this.state = {
	 listeEquipes:[
	 {
                id: teamId,
                name: teamName,
                city: teamCity,
                players: []
            },
			...
			]
 }
			
  • ajouter Equipe
  • supprimer Equipe
  • modifier Equipe
  • ajouter Joueur
  • supprimer Joueur
  • modifier Joueur
Solution
Veuillez compléter la solution en ajoutant les autres fonctionnalités

Avec Component de type function

```jsx
import React, { useState } from "react";
import "./App.css";

function FootballGame() {

    // =========================================================
    // STATE : Liste des équipes
    // =========================================================

    const [listeEquipes, setListeEquipes] = useState([]);


    // =========================================================
    // STATE : Équipe en cours de saisie
    // =========================================================

    const [equipe, setEquipe] = useState({
        id: '',
        nom: '',
        city: ''
    });


    // =========================================================
    // STATE : Joueur en cours de saisie
    // =========================================================

    const [joueur, setJoueur] = useState({
        id: '',
        nom: '',
        num: '',
        idEquipe: ''
    });


    // =========================================================
    // STATE : Message
    // =========================================================

    const [message, setMessage] = useState('');


    // =========================================================
    // STATE : Index de l'équipe à modifier
    //
    // -1 signifie qu'aucune équipe n'est en modification
    // =========================================================

    const [indexEquipeAmodifier, setIndexEquipeAmodifier] = useState(-1);


    // =========================================================
    // RÉCUPÉRER LES VALEURS DE L'ÉQUIPE
    // =========================================================

    const getValueEquipe = (event) => {

        const {
            name,
            value
        } = event.target;

        setEquipe({
            ...equipe,
            [name]: value
        });

    };


    // =========================================================
    // RÉCUPÉRER LES VALEURS DU JOUEUR
    // =========================================================

    const getValueJoueur = (event) => {

        const {
            name,
            value
        } = event.target;

        setJoueur({
            ...joueur,
            [name]: value
        });

    };


    // =========================================================
    // AJOUTER UNE ÉQUIPE
    // =========================================================

    const ajouterEquipe = () => {

        const {
            nom,
            id,
            city
        } = equipe;


        // Vérifier que tous les champs sont remplis
        if (nom !== '' && id !== '' && city !== '') {

            const nouvelleEquipe = {
                id: id,
                nom: nom,
                city: city,
                listeJoueur: []
            };


            // Ajouter la nouvelle équipe
            setListeEquipes([
                ...listeEquipes,
                nouvelleEquipe
            ]);


            // Réinitialiser le formulaire
            setEquipe({
                id: '',
                nom: '',
                city: ''
            });


            // Effacer le message
            setMessage('');

        }
        else {

            setMessage(
                'Erreur : tous les champs de l\'équipe sont obligatoires'
            );

        }

    };


    // =========================================================
    // AJOUTER UN JOUEUR
    // =========================================================

    const ajouterJoueur = () => {

        const {
            id,
            nom,
            num,
            idEquipe
        } = joueur;


        // Vérifier les champs obligatoires
        if (id !== '' && nom !== '' && num !== '') {

            // Vérifier qu'une équipe existe
            if (listeEquipes.length === 0) {

                setMessage(
                    'Erreur : vous devez ajouter une équipe'
                );

                return;
            }


            // Copier la liste des équipes
            const nouvelleListeEquipes = [...listeEquipes];


            // Récupérer l'équipe sélectionnée
            const equipeSelectionnee =
                nouvelleListeEquipes[Number(idEquipe)];


            // Vérifier que l'équipe existe
            if (!equipeSelectionnee) {

                setMessage(
                    'Erreur : veuillez sélectionner une équipe'
                );

                return;
            }


            // Ajouter le joueur dans une nouvelle liste
            equipeSelectionnee.listeJoueur = [
                ...equipeSelectionnee.listeJoueur,
                {
                    id: id,
                    nom: nom,
                    num: num,
                    idEquipe: idEquipe
                }
            ];


            // Mettre à jour la liste des équipes
            setListeEquipes(nouvelleListeEquipes);


            // Réinitialiser le formulaire joueur
            setJoueur({
                id: '',
                nom: '',
                num: '',
                idEquipe: ''
            });


            // Effacer le message
            setMessage('');

        }
        else {

            setMessage(
                'Erreur : tous les champs du joueur sont obligatoires'
            );

        }

    };


    // =========================================================
    // SUPPRIMER UNE ÉQUIPE
    // =========================================================

    const supprimerEquipe = (indexEquipeAsupprimer) => {

        setListeEquipes(
            listeEquipes.filter(
                (eq, index) =>
                    index !== indexEquipeAsupprimer
            )
        );

    };


    // =========================================================
    // MODIFIER UNE ÉQUIPE
    // =========================================================

    const modifierEquipe = (index, eq) => {

        // Charger les informations de l'équipe
        // dans le formulaire
        setEquipe({
            id: eq.id,
            nom: eq.nom,
            city: eq.city
        });


        // Mémoriser l'index de l'équipe
        setIndexEquipeAmodifier(index);


        // Effacer le message
        setMessage('');

    };


    // =========================================================
    // VALIDER LA MODIFICATION
    // =========================================================

    const validerModifier = () => {

        // Vérifier qu'un index est sélectionné
        if (indexEquipeAmodifier === -1) {
            return;
        }


        // Copier la liste des équipes
        const nouvelleListeEquipes = [...listeEquipes];


        // Récupérer l'ancienne équipe
        const ancienneEquipe =
            nouvelleListeEquipes[indexEquipeAmodifier];


        // Créer la nouvelle équipe
        // en conservant les joueurs existants
        const nouvelleEquipe = {

            id: equipe.id,

            nom: equipe.nom,

            city: equipe.city,

            listeJoueur: [
                ...ancienneEquipe.listeJoueur
            ]

        };


        // Remplacer l'ancienne équipe
        nouvelleListeEquipes[indexEquipeAmodifier] =
            nouvelleEquipe;


        // Mettre à jour la liste
        setListeEquipes(nouvelleListeEquipes);


        // Quitter le mode modification
        setIndexEquipeAmodifier(-1);


        // Réinitialiser le formulaire
        setEquipe({
            id: '',
            nom: '',
            city: ''
        });


        // Effacer le message
        setMessage('');

    };


    // =========================================================
    // RENDER
    // =========================================================

    return (

        <div>

            {/* =================================================
                FORMULAIRE ÉQUIPE
            ================================================= */}

            <h2>Ajouter Équipe</h2>

            <div>

                ID :

                <input
                    type="number"
                    name="id"
                    value={equipe.id}
                    onChange={getValueEquipe}
                />

                <br />


                Nom :

                <input
                    type="text"
                    name="nom"
                    value={equipe.nom}
                    onChange={getValueEquipe}
                />

                <br />


                City :

                <input
                    type="text"
                    name="city"
                    value={equipe.city}
                    onChange={getValueEquipe}
                />

                <br />


                {/* =================================================
                    BOUTON AJOUTER / MODIFIER
                ================================================= */}

                {
                    indexEquipeAmodifier !== -1

                        ?

                        (
                            <input
                                type="button"
                                value="Modifier"
                                onClick={validerModifier}
                            />
                        )

                        :

                        (
                            <input
                                type="button"
                                value="Add Equipe"
                                onClick={ajouterEquipe}
                            />
                        )
                }

            </div>


            {/* =================================================
                MESSAGE
            ================================================= */}

            {
                message !== '' && (

                    <p>
                        {message}
                    </p>

                )
            }


            {/* =================================================
                FORMULAIRE JOUEUR
            ================================================= */}

            <h2>Ajouter Joueur</h2>


            <div>

                Équipe :

                <select
                    name="idEquipe"
                    value={joueur.idEquipe}
                    onChange={getValueJoueur}
                >

                    <option value="">
                        -- Sélectionner une équipe --
                    </option>


                    {
                        listeEquipes.map((eq, index) => (

                            <option
                                key={index}
                                value={index}
                            >
                                {eq.nom}
                            </option>

                        ))
                    }

                </select>

                <br />


                ID :

                <input
                    type="number"
                    name="id"
                    value={joueur.id}
                    onChange={getValueJoueur}
                />

                <br />


                Nom :

                <input
                    type="text"
                    name="nom"
                    value={joueur.nom}
                    onChange={getValueJoueur}
                />

                <br />


                Numéro :

                <input
                    type="number"
                    name="num"
                    value={joueur.num}
                    onChange={getValueJoueur}
                />

                <br />


                <input
                    type="button"
                    value="Ajouter le Joueur"
                    onClick={ajouterJoueur}
                />

            </div>


            {/* =================================================
                LISTE DES ÉQUIPES
            ================================================= */}

            {
                listeEquipes.length > 0

                    ?

                    (

                        <div>

                            <h2>
                                Liste Équipes
                            </h2>


                            <table>

                                <thead>

                                    <tr>

                                        <th>
                                            Actions
                                        </th>

                                        <th>
                                            ID
                                        </th>

                                        <th>
                                            Nom
                                        </th>

                                        <th>
                                            City
                                        </th>

                                        <th>
                                            Joueurs
                                        </th>

                                    </tr>

                                </thead>


                                <tbody>

                                    {
                                        listeEquipes.map(
                                            (eq, index) => (

                                                <tr key={index}>

                                                    {/* =================
                                                        ACTIONS
                                                    ================= */}

                                                    <td>

                                                        <input
                                                            type="button"
                                                            value="Supprimer"
                                                            onClick={() =>
                                                                supprimerEquipe(index)
                                                            }
                                                        />


                                                        <input
                                                            type="button"
                                                            value="Modifier"
                                                            onClick={() =>
                                                                modifierEquipe(
                                                                    index,
                                                                    eq
                                                                )
                                                            }
                                                        />

                                                    </td>


                                                    {/* =================
                                                        INFORMATIONS
                                                    ================= */}

                                                    <td>
                                                        {eq.id}
                                                    </td>

                                                    <td>
                                                        {eq.nom}
                                                    </td>

                                                    <td>
                                                        {eq.city}
                                                    </td>


                                                    {/* =================
                                                        LISTE JOUEURS
                                                    ================= */}

                                                    <td>

                                                        {
                                                            eq.listeJoueur.length > 0

                                                                ?

                                                                (

                                                                    <table>

                                                                        <thead>

                                                                            <tr>

                                                                                <th>
                                                                                    ID
                                                                                </th>

                                                                                <th>
                                                                                    Nom
                                                                                </th>

                                                                                <th>
                                                                                    Numéro
                                                                                </th>

                                                                            </tr>

                                                                        </thead>


                                                                        <tbody>

                                                                            {
                                                                                eq.listeJoueur.map(
                                                                                    (jo, index2) => (

                                                                                        <tr
                                                                                            key={index2}
                                                                                        >

                                                                                            <td>
                                                                                                {jo.id}
                                                                                            </td>

                                                                                            <td>
                                                                                                {jo.nom}
                                                                                            </td>

                                                                                            <td>
                                                                                                {jo.num}
                                                                                            </td>

                                                                                        </tr>

                                                                                    )
                                                                                )
                                                                            }

                                                                        </tbody>

                                                                    </table>

                                                                )

                                                                :

                                                                (
                                                                    <span>
                                                                        Aucun joueur
                                                                    </span>
                                                                )
                                                        }

                                                    </td>

                                                </tr>

                                            )
                                        )
                                    }

                                </tbody>

                            </table>

                        </div>

                    )

                    :

                    (
                        <h1>
                            Rien à afficher
                        </h1>
                    )
            }

        </div>
    );
}

export default FootballGame;

Avec Component de type Class

import { Component } from "react";
import "./App.css"
class FootballGame extends Component
{
 constructor() {
  super();
  this.state = {
    listeEquipes: [
      {
                    id:'',
                    nom:'',
                    city:'',
                    listeJoueur:[]
                }
                    

    ],

    equipe: {
      id: '',
      nom: '',
      city: ''
    },

    joueur: {
      id: '',
      nom: '',
      num: '',
      idEquipe: ''

    },
    message: '',
    indexEquipeAmodifier: -1
  }
}
//===========fin state ===========

//récupérer les valeur de l'équipe
getValueEquipe = (event) = >{
  //récupérer name et value from input
  const {
    name,
    value
  } = event.target;
  this.setState({
    equipe: {...this.state.equipe,
      [name] : value
    }
  })
}

	
//=========================

    
      //récupérer les valeur du joueur
getValueJoeur = (event) = >{
  //récupérer name et value from input
  const {
    name,
    value
  } = event.target;
  this.setState({
    joueur: {...this.state.joueur,
      [name] : value
    }
  })
}

//========================



    ajouterEquipe=()=>{
        const {nom,id,city}=this.state.equipe;
        //validation des données du l'équipe
        if(nom!=''&& id!='' && city!='')
        {
            this.setState({
                listeEquipes:[...this.state.listeEquipes,
                    {
                        id:this.state.equipe.id,
                        nom:this.state.equipe.nom,
                        city:this.state.equipe.city,
                        listeJoueur:[]
                    }
                ]
            })

        }
        else{
     this.setState({
        message:'Erreur tout les champs sont obligatoire'
     })
        }
    }

	
//========================

   ajouterJoueur = () = >{
  //validation des données du joueur
  const {
    id,
    nom,
    num,
    idEquipe
  } = this.state.joueur;
  if (id && nom && num) {
    //récupéer l'equpe quant veut ajouter un joueur dans Sa listeJoueur:[]
    const equipeAjouterUnJoeur = this.state.listeEquipes[idEquipe];
    //ajouter le nouveau joueur dans la liste des joueurs de cette Equipe
    equipeAjouterUnJoeur.listeJoueur.push(this.state.joueur);

    const listeEquipeOriginale = this.state.listeEquipes;
    listeEquipeOriginale[idEquipe] = equipeAjouterUnJoeur;

    this.setState({
      listeEquipes: listeEquipeOriginale

    })

  } else {
    this.setState({
      message: "tout les champs du joeurs sont obligatoires"
    })
  }
}

//========================
supprimerEquipe = (indexEquipeAsupprimer) = >{
  this.setState({
    listeEquipes: this.state.listeEquipes.filter((eq, index) = >index != indexEquipeAsupprimer)
  })
}

//========================

modifierEquipe = (index, eq) = >{

  this.setState({
    equipe: eq,
    indexEquipeAmodifier: index
  })
}

//========================
validerModifier = () = >{
  const indexEquipeAmodifier = this.state.listeEquipes[this.state.indexEquipeAmodifier];
  const newEquipe = {
    id: this.state.equipe.id,
    nom: this.state.equipe.nom,
    city: this.state.equipe.city,
    listeJoueur: indexEquipeAmodifier.listeJoueur
  }

  const listeEquipeOriginale = this.state.listeEquipes;
  listeEquipeOriginale[this.state.indexEquipeAmodifier] = newEquipe;
  this.setState({
    listeEquipes: listeEquipeOriginale

  })

    }
    render()
    {
        return(<div>
            Add Equipe:<br/>
          id:  <input type="number" name="id" onChange={this.getValueEquipe} value={this.state.equipe.id}/><br/>
          nom:  <input type="text" name="nom" onChange={this.getValueEquipe} value={this.state.equipe.nom}/><br/>
          city:  <input type="text" name="city" onChange={this.getValueEquipe} value={this.state.equipe.city}/><br/>
              {
                this.state.indexEquipeAmodifier!=-1 ? (
               <input type="button" value="Modifier" onClick={this.validerModifier}/>
                ):(
                    <input type="button" value="AddEquipe" onClick={this.ajouterEquipe}/> 
  
                )
              }
               
                {this.state.message}


<h2>Ajouter Joeur</h2>
City:<select name="idEquipe" onChange={this.getValueJoeur}>
    {
        this.state.listeEquipes.map((eq,index)=>
        {
            return (<option value={index}>
                {eq.nom}
            </option>)

        })
    }
</select>
Id:<input type="number"name="id" onChange={this.getValueJoeur}/><br/>
Nom:<input type="text" name="nom" onChange={this.getValueJoeur}/><br/>
Num:<input type="number"  name="num" onChange={this.getValueJoeur}/><br/>

<input type="button" value="Ajouter le Joueur" onClick={this.ajouterJoueur}/>
{this.state.listeEquipes.length>1 ? (
           <h2>Liste Equipes</h2>
                <table>
                    <thead>
                    <th>Actions</th>
                        <th>Id</th>
                        <th>Nom</th>
                        <th>City</th>
                        <th>Joeurs</th>
                        
                    </thead>
                    <tbody>
                        {this.state.listeEquipes.map((eq,index)=>{
                            return(<tr key={index}>
                        <td>
                            <input type="button" onClick={()=>{this.supprimerEquipe(index)}} value="Supprimer"/>
                            <input type="button" onClick={()=>{this.modifierEquipe(index,eq)}} value="Modifier"/></td>
                         <td>{eq.id}</td>
                         <td>{eq.nom}</td>
                         <td>{eq.city}</td>
                         <td>

                            <table>
                                <thead>
                                    <th>Id</th>
                                    <th>Nom</th>
                                    <th>Numéro</th>
                                </thead>
                                <tbody>
                                    {
                                      eq.listeJoueur.map((jo,index2)=>{
                                        return(<tr key={index2}>
                                            <td>{jo.id}</td>
                                            <td>{jo.nom}</td>
                                            <td>{jo.num}</td>
                                        </tr>)
                                      })  
                                    }
                                </tbody>
                            </table>
                         </td>

                            </tr>)
                        })}
                    </tbody>
                </table>
				):(<h1>Rien à affiché </h1>)
}
        </div>)
    }
}
export default FootballGame;