Je veux ajouter un élément à la fin d'un state
tableau, est-ce la bonne façon de le faire?
this.state.arrayvar.push(newelement);
this.setState({arrayvar:this.state.arrayvar});
Je crains que la modification de la baie en place avec push
puisse causer des problèmes - est-ce sûr?
L'alternative de faire une copie du tableau, et setState
cela semble inutile.
javascript
reactjs
fadedbee
la source
la source
Réponses:
Les documents React disent:
Votre
push
mutera directement l'état et cela pourrait potentiellement conduire à un code sujet aux erreurs, même si vous "réinitialisez" à nouveau l'état par la suite. F.ex, cela pourrait conduire à ce que certaines méthodes de cycle de vie commecomponentDidUpdate
ne se déclenchent pas.L'approche recommandée dans les versions ultérieures de React consiste à utiliser une fonction de mise à jour lors de la modification des états pour éviter les conditions de concurrence:
Le «gaspillage» de mémoire n'est pas un problème par rapport aux erreurs que vous pourriez rencontrer en utilisant des modifications d'état non standard.
Syntaxe alternative pour les versions antérieures de React
Vous pouvez utiliser
concat
pour obtenir une syntaxe propre car elle retourne un nouveau tableau:Dans ES6, vous pouvez utiliser l' opérateur Spread :
la source
push
renvoie la nouvelle longueur du tableau afin que cela ne fonctionne pas. En outre,setState
est asynchrone et React peut mettre en file d'attente plusieurs changements d'état en une seule passe de rendu.setState
deux fois, elle montre deux exemples similaires de définition d'un tableau d'état sans le muter directement.let list = Array.from(this.state.list); list.push('woo'); this.setState({list});
Modifiez bien sûr vos préférences de style.Le plus simple, si vous utilisez
ES6
.Un nouveau tableau sera
[1,2,3,4]
mettre à jour votre état dans React
En savoir plus sur la déstructuration des baies
la source
La manière la plus simple avec
ES6
:la source
tableData = [['test','test']]
Après avoir poussé mon nouveau tableautableData = [['test','test'],['new','new']]
. comment pousser ce @David et @Ridd[['test','test'],['new','new']]
essayer:this.setState({ tableData: [...this.state.tableData, ['new', 'new']]
this.setState({ tableData: [...this.state.tableData ,[item.student_name,item.homework_status_name,item.comments===null?'-':item.comments] ] });
Il insère le nouveau tableau deux fois.this.state.tableData.push([item.student_name,item.homework_status_name,item.comments===null?'-':item.comments]);
Il réalise ce que je veux. mais ce n'est pas la bonne façon je pense.React peut effectuer des mises à jour par lots et, par conséquent, l'approche correcte consiste à fournir à setState une fonction qui effectue la mise à jour.
Pour l'addon de mise à jour React, les éléments suivants fonctionneront de manière fiable:
ou pour concat ():
Ce qui suit montre ce que https://jsbin.com/mofekakuqi/7/edit?js,output comme exemple de ce qui se passe si vous vous trompez.
L'invocation setTimeout () ajoute correctement trois éléments car React n'effectuera pas de mises à jour par lots dans un rappel setTimeout (voir https://groups.google.com/d/msg/reactjs/G6pljvpTGX0/0ihYw2zK9dEJ ).
Le buggy onClick n'ajoutera que "Third", mais le fixe, ajoutera F, S et T comme prévu.
la source
this.setState( update(this.state, {array: {$push: ["First", "Second", "Third"]}}) )
state.array = state.array.concat([4])
cela mute l'objet d'état précédent.Comme @nilgun l'a mentionné dans le commentaire, vous pouvez utiliser les assistants react immuability . J'ai trouvé que c'était super utile.
De la documentation:
Poussée simple
initialArray est toujours [1, 2, 3].
la source
Si vous utilisez un composant fonctionnel, veuillez l'utiliser comme ci-dessous.
la source
Pour ajouter un nouvel élément dans le tableau,
push()
devrait être la réponse.Pour supprimer l'élément et mettre à jour l'état du tableau, le code ci-dessous fonctionne pour moi.
splice(index, 1)
ne peut pas fonctionner.la source
J'essaie de pousser la valeur dans un état de tableau et de définir une valeur comme celle-ci et de définir le tableau d'état et de pousser la valeur par la fonction de carte.
la source
Cela a fonctionné pour moi d'ajouter un tableau dans un tableau
la source
Voici un exemple de Reactjs Hook en 2020 qui, selon moi, pourrait aider les autres. Je l'utilise pour ajouter de nouvelles lignes à une table Reactjs. Faites-moi savoir si je peux améliorer quelque chose.
Ajout d'un nouvel élément à un composant d'état fonctionnel:
Définissez les données d'état:
Demandez à un bouton de déclencher une fonction pour ajouter un nouvel élément
la source
la source
stackoverflow
.setState(state => ({arrayvar: [...state.arrayvar, ...newelement]}) );
newelement
objet dans un tableau lance un deTypeError
toute façon.la source
Ce code fonctionne pour moi:
la source
.push
renvoie un nombre , pas un tableau.