387 votes

Méthode Push dans React Hooks (useState) ?

Comment pousser un élément dans le React hook du tableau useState ? Est-ce une ancienne méthode dans react state ? Ou quelque chose de nouveau ?

Par exemple exemple de setState push ?

7voto

MD SHAYON Points 93

Créer un état de tableau avec useState() Tout d'abord, voyons comment utiliser le hook useState() pour créer une variable d'état de type tableau.

import React from "react";

const { useState } = React;

const [myArray, setMyArray] = useState([]);

Cependant, avec React, nous devons utiliser la méthode renvoyée par useState pour mettre à jour le tableau.

setMyArray(oldArray => [...oldArray, newElement]);

en savoir plus

1 votes

L'argument de type "(oldArray : { array1 : string[] ; }) => any[]" n'est pas affectable au paramètre de type "SetStateAction<{ array1 : string[] ; }>". Le type '(oldArray : { array1 : string[] ; }) => any[]' n'est pas assignable au type '(prevState : { array1 : string[] ; }) => { array1 : string[] ; }'. La propriété 'array1' est manquante dans le type 'any[]' mais requise dans le type '{ array1 : string[] ; }'.ts(2345)

5voto

r g Points 2544

De la même manière que vous le faites avec l'état "normal" dans les composants de classe React.

exemple :

function App() {
  const [state, setState] = useState([]);

  return (
    <div>
      <p>You clicked {state.join(" and ")}</p>
      //destructuring
      <button onClick={() => setState([...state, "again"])}>Click me</button>
      //old way
      <button onClick={() => setState(state.concat("again"))}>Click me</button>
    </div>
  );
}

2 votes

Cela fonctionnera avec onClick, mais c'est avec setState(oldState => [...oldState, pushsomething]) que vous devez le faire.

2voto

SHIVANG SANGHI Points 256

setTheArray([...theArray, newElement]); est la réponse la plus simple mais faites attention à la mutation des éléments dans theArray . Utilisez le clonage profond des éléments du tableau.

0 votes

Le clonage profond que vous mentionnez, cela signifie-t-il recevoir comme objA. UseState et concaténer l'objA avec l'objB ? Comme dans ce lien ? gist.githubusercontent.com/kahsing/

2voto

Sergi Juanati Points 447

J'ai essayé les méthodes ci-dessus pour pousser un objet dans un tableau d'objets dans useState mais j'ai eu l'erreur suivante en utilisant TypeScript :

Le type 'TxBacklog[] | undefined' doit avoir une méthode 'Symbol.iterator' qui renvoie un itérateur.ts(2488)

La configuration du tsconfig.json était apparemment correcte :

{
   "compilerOptions": {
   "target": "es6",
   "lib": [
      "dom",
      "dom.iterable",
      "esnext",
      "es6",
],

Cette solution de contournement a résolu le problème (mon exemple de code) :

Interface :

   interface TxBacklog {
      status: string,
      txHash: string,
   }

Variable d'état :

    const [txBacklog, setTxBacklog] = React.useState<TxBacklog[]>();

Pousse le nouvel objet dans le tableau :

    // Define new object to be added
    const newTx = {
       txHash: '0x368eb7269eb88ba86..',
       status: 'pending'
    };
    // Push new object into array
    (txBacklog) 
       ? setTxBacklog(prevState => [ ...prevState!, newTx ])
       : setTxBacklog([newTx]);

2voto

Hossein Haji Mali Points 139

Si vous voulez pousser après un index spécifique, vous pouvez faire comme ci-dessous :

   const handleAddAfterIndex = index => {
       setTheArray(oldItems => {
            const copyItems = [...oldItems];
            const finalItems = [];
            for (let i = 0; i < copyItems.length; i += 1) {
                if (i === index) {
                    finalItems.push(copyItems[i]);
                    finalItems.push(newItem);
                } else {
                    finalItems.push(copyItems[i]);
                }
            }
            return finalItems;
        });
    };

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X