Wie schiebe ich ein Element in das useState-Array? React hook? Ist das eine alte Methode im Reaktionszustand? Oder etwas Neues?
quelle
Wie schiebe ich ein Element in das useState-Array? React hook? Ist das eine alte Methode im Reaktionszustand? Oder etwas Neues?
Wenn Sie verwenden useState
, können Sie eine Aktualisierungsmethode für das Statuselement erhalten:
const [theArray, setTheArray] = useState(initialArray);
Wenn Sie dann ein neues Element hinzufügen möchten, verwenden Sie diese Funktion und übergeben das neue Array oder eine Funktion, die das neue Array erstellt. Normalerweise letzteres, da Statusaktualisierungen asynchron und manchmal stapelweise sind:
setTheArray(oldArray => [...oldArray, newElement]);
Manchmal kann man , ohne dass die Callback - Formular weg, wenn Sie nur das Array in Handler für bestimmte Benutzerereignisse aktualisieren wie click
(aber nicht wie mousemove
):
setTheArray([...theArray, newElement]);
Die Ereignisse , für die gewährleistet , dass Reagieren Rendering gespült wird die „diskrete Ereignisse“ aufgeführt hier .
Live-Beispiel (Rückruf an setTheArray
):
Da das einzige Update darin theArray
das in einem click
Ereignis ist (eines der "diskreten" Ereignisse), könnte ich mit einem direkten Update davonkommen addEntry
:
setTheArray(currentArray => [...currentArray, newElement])
wenn das oben genannte nicht funktioniert. HöchstwahrscheinlichuseEffect(...theArray..., [])
ist es wichtig zu erkennen, dass diestheArray
eine Konstante ist, daher sind funktionale Aktualisierungen für Werte aus zukünftigenuseEffect
Beispiel sagen ...?useEffect
eine leere Abhängigkeitsliste hat[]
, wird es nur beim ersten Rendern ausgeführt. Der Wert vontheArray
innerhalb des Effekts wird also immer seininitialArray
. In Situationen, in denensetTheArray([...initialArray, newElement])
dies keinen SinntheArray
ergibt und in denen die Konstante immer gleich ist,initialValue
sind Funktionsaktualisierungen erforderlich.Um ein wenig weiter zu expandieren, hier einige allgemeine Beispiele. Beginnen mit:
const [theArray, setTheArray] = useState(initialArray); const [theObject, setTheObject] = useState(initialObject);
Schieben Sie das Element am Ende des Arrays
setTheArray(prevArray => [...prevArray, newValue])
Element am Ende des Objekts pushen / aktualisieren
setTheObject(prevState => ({ ...prevState, currentOrNewKey: newValue}));
Push / Update-Element am Ende des Array von Objekten
setTheArray(prevState => [...prevState, {currentOrNewKey: newValue}]);
Schieben Sie das Element am Ende des Objekts der Arrays
let specificArrayInObject = theObject.array.slice(); specificArrayInObject.push(newValue); const newObj = { ...theObject, [event.target.name]: specificArrayInObject }; theObject(newObj);
Hier sind auch einige Arbeitsbeispiele. https://codesandbox.io/s/reacthooks-push-r991u
quelle
Genauso wie Sie es mit dem "normalen" Status in React-Klassenkomponenten tun.
Beispiel:
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> ); }
quelle
// Save search term state to React Hooks with spread operator and wrapper function // Using .concat(), no wrapper function (not recommended) setSearches(searches.concat(query)) // Using .concat(), wrapper function (recommended) setSearches(searches => searches.concat(query)) // Spread operator, no wrapper function (not recommended) setSearches([...searches, query]) // Spread operator, wrapper function (recommended) setSearches(searches => [...searches, query])
quelle
setTheArray([...theArray, newElement]);
ist die einfachste Antwort, aber achten Sie auf die Mutation von Elementen im Array . Verwenden Sie das Deep Cloning von Array-Elementen.quelle
Die am meisten empfohlene Methode ist die gemeinsame Verwendung der Wrapper-Funktion und des Spread-Operators. Wenn Sie beispielsweise einen Status
name
wie diesen initialisiert haben ,const [names, setNames] = useState([])
Sie können auf dieses Array wie folgt pushen:
setNames(names => [...names, newName])
Hoffentlich hilft das.
quelle
Ich habe die oben genannten Methoden zum Verschieben eines Objekts in ein Array von Objekten in useState ausprobiert, hatte jedoch den folgenden Fehler bei der Verwendung von TypeScript :
Das Setup für tsconfig.json war anscheinend richtig:
{ "compilerOptions": { "target": "es6", "lib": [ "dom", "dom.iterable", "esnext", "es6", ],
Diese Problemumgehung hat das Problem gelöst (mein Beispielcode):
Schnittstelle:
interface TxBacklog { status: string, txHash: string, }
Zustandsvariable:
const [txBacklog, setTxBacklog] = React.useState<TxBacklog[]>();
Neues Objekt in Array schieben:
// Define new object to be added const newTx = { txHash: '0x368eb7269eb88ba86..', status: 'pending' }; // Push new object into array (txBacklog) ? setTxBacklog(prevState => [ ...prevState!, newTx ]) : setTxBacklog([newTx]);
quelle
Wenn Sie nach einem bestimmten Index pushen möchten, können Sie wie folgt vorgehen:
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; }); };
quelle