J'essaie actuellement de créer une application Web à l'aide de React qui invite l'utilisateur à saisir quelque chose à l'aide d'un formulaire. Lors de la soumission, le code crée un objet "teammate" puis le pousse vers le tableau "Team". Je souhaite ensuite utiliser la méthode map pour parcourir mon tableau et afficher tous les objets des coéquipiers sur chaque carte. Je ne comprends pas pourquoi la ligne 94 d'App.js n'affiche pas mon tableau. S'il vous plaît, aidez, toutes les suggestions seront grandement appréciées.
import logo from './Nemo.jpg'; import './App.css'; import { useState, useEffect } from 'react'; import './Card.css' const App = () => { const NavBar = () => { return( <> <nav> <div style={{display: 'inline-flex'}}> <a href='index.js'> <img src={logo} width="80" height="80" viewBox="0 0 40 40" fill="none"></img> </a> <h1>Metric Dashboard</h1> </div> </nav> <br></br> </> ) } const MyForm = () =>{ //Define Team array const [Team,setTeam] = useState([]); //Function used for submit const handleSubmit = (event) => { event.preventDefault(); let teammate = { myId: Math.floor(Math.random() * 10000), myUserName: document.getElementById('user').value, mySweepName: document.getElementById('SweepName').value, mySweepDate: document.getElementById('SweepDate').value, mySweepCases: document.getElementById('SweepCases').value, update: function() { this.mySweepDate = document.getElementById('SweepDate').value; this.mySweepCases = document.getElementById('SweepCases').value; this.mySweepName = document.getElementById('SweepName').value; } } console.log(teammate) if(Team.length === 0 ){ //If array is empty console.log("This array is empty") Team.push(teammate) console.log("Array is no longer empty") } //If not empty checks if the user submits with the same sweep name. If same, update and not push to array else if(Team.length !== 0 ){ console.log("This Array is not empty") for(let i = 0; i < Team.length; i++){ if(Team[i].mySweepName === document.getElementById('SweepName') && Team[i].myUserName === document.getElementById('user').value){ console.log("Teammate Updated") document.forms[0].reset() return(Team[i].update()) } } //If not empty and no duplicates, push object to array Team.push(teammate) } console.log(Team) document.forms[0].reset() } return( <> <form> SWEEP <br/> Name: <select id="user"> <option value="default">Select your name</option> <option value="John Doe">John Doe</option> <option value="Plain Jane">Plain Jane</option> <option value="Mike Jones">Mike Jones</option> </select><br/> Name of Sweep: <input type='name'placeholder='Name of Sweep' id="SweepName" /><br/> Date: <input type='date' placeholder='Data' id="SweepDate"/><br/> Cases: <input type="number" min="0" placeholder='# of cases' id="SweepCases"/> <br/> <input className='mySubmit' type="submit" onClick= {handleSubmit}/><br/><br/> </form> <div className='cardContainer'> {Team.map((item) =>( <ul key={item.myId} className='sweepCard'> <li>{item.myUserName}</li> <li>Sweep Name: {item.mySweepName}</li> <li>Sweep Date: {item.mySweepDate}</li> <li>Sweep Cases: {item.mySweepCases}</li> </ul> ))} </div> </> ) } return ( <div className='App'> <div className='NavBar_Component'> <NavBar/> </div> <div className='Display_comps'> <div className='tryAgain'> <MyForm/> </div> </div> </div> ); } export default App;
Pendant le débogage, j'ai découvert que mon exécution atteignait la ligne 94 dans App.js mais n'avait jamais démarré l'itération Team.map.
Le problème réside dans la manière dont vous mettez à jour le tableau de statut de l'équipe. Dans React, vous ne devez pas modifier directement les variables d'état (Team dans ce cas) à l'aide de méthodes telles que push, car cela ne déclenchera pas un nouveau rendu du composant et React ne reconnaîtra pas les mises à jour d'état.
Pour résoudre ce problème, vous devez utiliser la fonction setTeam fournie par le hook useState pour mettre à jour correctement le tableau d'état. La fonction setTeam met à jour l'état et déclenche un nouveau rendu du composant pour garantir que les nouvelles données sont affichées.
Fonction handleSubmit :
En utilisant la fonction setTeam et en transmettant l'état mis à jour en tant que nouveau tableau (ou une copie modifiée de l'état précédent), vous vous assurez que les données correctes sont affichées lors du nouveau rendu du composant et que l'itération Team.map affichera l'état mis à jour. éléments du tableau.