0
votes

Basculer l'élément dans un tableau réagissant

Je veux basculer une propriété d'un objet dans un tableau. Le tableau ressemble comme suit. Ceci est utilisé dans un composant réacteur et lorsqu'un utilisateur clique sur un bouton, je souhaite basculer le gagnant.

function Parent = () => {

  const [fixtures, setUpdateFixtures] = useState(initialFixtures)
  const toggleWinner = (index) => {
     const updatedFixtures = fixtures.map((fixture, i) => {
           if (i === index) {
                return {
                    ...fixture,
                    winner: fixture.winner === home ? away : home,
                };
            } else {
                return fixture;
            }
     }) 
     setUpdateFixtures(updatedFixtures);
  }

  return <Fixtures fixtures={fixtures} toggleWinner={toggleWinner} />;

}


function Fixtures = ({ fixtures, toggleWinner }) => { 
  fixtures.map((fixture, index) => ( 
    <div>
        <p>{fixture.winner} </p>
    <button onClick = {() => toggleWinner(index)}> Change Winner</button> 
    </div>
  ))
}


5 commentaires

Où est Changewinner fonction?


Où et le home et Away variables déclarées?


Le code fonctionne, mais on a l'impression que c'est un peu trop. Les demandes de révision du code sont hors tension ici. Regardez cr


Question rapide. Comment est-ce: fonction fonction = () => { fonctionne ??


C'est un composant fonctionnel étant rendu dans l'application. Il utilise des crochets si c'est ce que vous demandez?


6 Réponses :


0
votes
      const toggleWinner = (index) => {
        let  updatedFixtures = [...fixtures].splice(index, 1, {...fixtures[index],
         winner: fixtures[index].winner === fixtures[index].teams.home
         ? fixtures[index].teams.away : fixtures[index].teams.home})

        setUpdateFixtures(updatedFixtures);
      }

0 commentaires

0
votes

Vous pouvez utiliser des bibliothèques telles que Immer pour mettre à jour les états imbriqués facilement facilement.

p>

<script src="https://cdn.jsdelivr.net/npm/immer@1.0.1/dist/immer.umd.js"></script>


0 commentaires

4
votes
const updatedFixtures = [...fixtures];
const fixture = updatedFixtures[i];
updatedFixtures[i] = {
  ...fixture,
  winner: fixture.winner === fixture.teams.home ? fixture.teams.away : fixture.teams.home,
};

3 commentaires

Cela va muté le tableau, non?


Il ne mutera que la matrice UpdatedFixTures. Comme celui-ci ne fait pas partie de l'état (encore), vous pouvez la muter comme vous le souhaitez.


Si votre préoccupation concernait la déclaration de const, MDN déclare que la déclaration de const crée une référence en lecture seule à une valeur. Cela ne signifie pas que la valeur qu'il contient est immuable, mais que l'identifiant variable ne peut pas être réaffecté.



2
votes

vous pouvez SLICE Les fixtures Array en trois parties:

  • de 0 à index : fixtures.slice (0, index) . Cette partie est déplacée vers la nouvelle matrice intacte.

  • L'élément unique à index . Cette partie / élément est éloignée en raison d'être modifiée et un nouvel élément est substitué.

  • Le reste de la matrice: fixtures.slice (index + 1) .

    Ensuite, mettez-les dans un nouveau tableau: xxx

    pour construire le nouvel élément:


0 commentaires

0
votes

Si vous écrivez votre code de telle manière - cela fera le travail.

const toggleWinner = index => {
    const { winner, teams: { home, away } } = fixtures[index];
    fixtures[index].winner = winner === home ? away : home;

    setUpdateFixtures([...fixtures]);
};


0 commentaires

0
votes

Si vous êtes à l'aise d'utiliser une approche de classe, vous pouvez essayer quelque chose comme ceci:

  • Créez une classe qui détient la valeur de la propriété pour l'équipe. LI>
  • Créez une propriété booléenne dans cette classe, disons ishomewinner code>. Cette propriété décidera du gagnant. LI>
  • Créez ensuite une propriété getter gagnant code> qui va chercher ceci.Sishomewinner code> et donnera la valeur nécessaire. LI>
  • Cela vous permettra d'avoir une fonction propre bascule code> fonction: this.ishomewinner =! Ceci.Sishomewinner code>. Li>. ul>

    Vous pouvez également écrire votre togglewinner code> comme: p> xxx pré>

    Ceci semble propre et déclaratif. Remarque, si une immuabilité est nécessaire, alors seulement cela est requis. Si vous êtes à l'aise avec des valeurs de mutation, passez simplement fixture.toggle code> à votre composant de réact. Vous devrez peut-être bien lier le contexte, mais cela devrait fonctionner aussi bien. P>

    Donc, il ressemblerait à quelque chose comme: p> xxx pré>


    suivi est un échantillon de classe et son utilisation: p>

    p>

    class Fixtures {
      constructor(home, away, isHomeWinner) {
        this.team = {
          home,
          away
        };
        this.isHomeWinner = isHomeWinner === undefined ? true : isHomeWinner;
      }
    
      get winner() {
        return this.isHomeWinner ? this.team.home : this.team.away;
      }
    
      toggle() {
        this.isHomeWinner = !this.isHomeWinner
      }
    }
    
    let initialFixtures = [
      new Fixtures('Liverpool', 'Manchester Utd'),
      new Fixtures('Chelsea', 'Fulham', false),
      new Fixtures('Arsenal', 'Tottenham'),
    ];
    
    const toggleWinner = (index) => {
      const newArr = initialFixtures.slice();
      newArr[index].toggle();
      return newArr;
    };
    
    initialFixtures.forEach((fixture) => console.log(fixture.winner))
    console.log('----------------')
    initialFixtures = toggleWinner(1);
    initialFixtures.forEach((fixture) => console.log(fixture.winner))
    
    initialFixtures = toggleWinner(2);
    console.log('----------------')
    initialFixtures.forEach((fixture) => console.log(fixture.winner))


1 commentaires

Merci d'avoir pris le temps de répondre, mais cela ne convient pas vraiment à ce que je veux faire.