J'essaie de trouver le meilleur moyen de supprimer un élément d'un tableau dans l'état d'un composant. Puisque je ne devrais pas modifier la this.state
variable directement, y a-t-il un meilleur moyen (plus concis) de supprimer un élément d'un tableau que ce que j'ai ici?:
onRemovePerson: function(index) {
this.setState(prevState => { // pass callback in setState to avoid race condition
let newData = prevState.data.slice() //copy array from prevState
newData.splice(index, 1) // remove element
return {data: newData} // update state
})
},
Je vous remercie.
actualisé
Cela a été mis à jour pour utiliser le rappel dans setState. Cela doit être fait lors du référencement de l'état actuel lors de sa mise à jour.
javascript
reactjs
aherriot
la source
la source
Réponses:
La façon la plus propre de faire cela que j'ai vue est avec
filter
:la source
_
est parfois utilisé pour représenter un argument inutilisé. Ici, c'est l'élément courant du tableau.this.state
comme entréethis.setState()
, même immuablement, n'est pas recommandée. s'il vous plaît voir ma réponse ci-dessus pour une référence aux documents officiels React sur ce sujet.Vous pouvez utiliser l'
update()
assistant d'immuabilité dereact-addons-update
, qui fait effectivement la même chose sous le capot, mais ce que vous faites est bien.la source
react-addons-update
est désormais obsolète (2016).immutability-helper
est disponible en remplacement. github.com/kolodny/immutability-helper Veuillez également voir ma réponse ci-dessous concernant la non-mutation de this.state directement dans this.setState ().Je crois référencer
this.state
intérieur desetState()
est déconseillé (les mises à jour d'état peuvent être asynchrones ).La documentation recommande d'utiliser
setState()
avec une fonction de rappel afin que prevState soit transmis au moment de l'exécution lorsque la mise à jour se produit. Voici donc à quoi cela ressemblerait:Utilisation de Array.prototype.filter sans ES6
Utilisation de Array.prototype.filter avec les fonctions fléchées ES6
Utiliser immutability-helper
Utiliser Spread
Notez que dans chaque instance, quelle que soit la technique utilisée,
this.setState()
est passé un rappel, pas une référence d'objet à l'ancienthis.state
;la source
this.setState({ data: [...this.state.data.slice(0, index), ...this.state.data.slice(index + 1)] });
est-ce mal d'utiliser à lathis.state
place de l'prevState
option de rappel montrée par @ user1628461?Voici un moyen de supprimer l'élément du tableau dans l'état à l'aide de la syntaxe de propagation ES6.
la source
Je souhaite intervenir ici même si cette question a déjà reçu une réponse correcte de @pscl au cas où quelqu'un d'autre rencontrerait le même problème que moi. Sur les 4 méthodes proposées, j'ai choisi d'utiliser la syntaxe es6 avec des fonctions fléchées en raison de sa concision et du manque de dépendance vis-à-vis des bibliothèques externes:
Utilisation de Array.prototype.filter avec les fonctions fléchées ES6
Comme vous pouvez le voir, j'ai fait une légère modification pour ignorer le type d'index (
!==
à!=
) car dans mon cas, je récupérais l'index à partir d'un champ de chaîne.Un autre point utile si vous constatez un comportement étrange lors de la suppression d'un élément côté client est de NE JAMAIS utiliser l'index d'un tableau comme clé de l'élément :
Lorsque React diffère avec le DOM virtuel lors d'un changement, il examinera les clés pour déterminer ce qui a changé. Donc, si vous utilisez des index et qu'il y en a un de moins dans le tableau, cela supprimera le dernier. Utilisez plutôt les identifiants du contenu comme clés, comme ceci.
Ce qui précède est un extrait de cette réponse d'un article connexe .
Bon codage à tous!
la source
Vous pouvez utiliser cette fonction, si vous souhaitez supprimer l'élément (sans index)
la source
Comme mentionné dans un commentaire à la réponse d'Ephrion ci-dessus, filter () peut être lent, en particulier avec de grands tableaux, car il effectue une boucle pour rechercher un index qui semble déjà avoir été déterminé. C'est une solution propre mais inefficace.
Comme alternative, on peut simplement «découper» l'élément souhaité et concaténer les fragments.
J'espère que cela t'aides!
la source
Vous pouvez rendre le code plus lisible avec une fonction d'assistance d'une ligne:
puis utilisez-le comme ceci:
la source
Juste une suggestion, dans votre code au lieu d'utiliser,
let newData = prevState.data
vous pouvez utiliser spread qui est introduit dans ES6 que vous pouvez utiliserlet newData = ...prevState.data
pour copier un tableauTrois points ... représentent les opérateurs de propagation ou les paramètres de repos ,
Il permet à une expression de tableau, à une chaîne ou à tout ce qui peut être itératif d'être développé à des endroits où zéro ou plusieurs arguments pour les appels de fonction ou des éléments pour le tableau sont attendus.
De plus, vous pouvez supprimer l'élément du tableau avec les éléments suivants
J'espère que cela contribue !!
la source
Voici un moyen simple de le faire:
J'espère que ça aide!!!
la source
delete
supprime l'élément mais que les index ne sont pas mis à jour et que ce ne serait donc pas une bonne approche pour les besoins réguliers.