Comment puis-je supprimer un attribut à partir d'un Reactjs composant de l'objet de l'état
Si j'ai une réagir composant qui a une propriété définie sur son état:
onClick() {
this.setState({ foo: 'bar' });
}
Est-il possible de supprimer "foo"
ici de Object.keys(this.state)
?
La replaceState méthode ressemble à l'évidence méthode pour essayer, mais c'est depuis été amortis.
C'est
deprecated
.OriginalL'auteur Joshua | 2015-10-01
Vous devez vous connecter pour publier un commentaire.
Le code suivant supprime
foo
dethis.state
sans en faire directement la mutationthis.state
:Vous aurez besoin de la étape 3 preset pour que cela fonctionne.
Object.assign
. Donc, c'est effectivement la même que ma solution avecObject.assign
, mais il nécessite une configuration supplémentaire de Babel de travail.Peu profondes, le clonage est OK et en fait encoutaged parce qu'il est rapide. Tant que vous suivez les règles autour de ce qui devrait être immuable, c'est la fin. Le
immutability-helper
de la bibliothèque, qui l'Réagissent docs recommander comme un remplacement pourreact-addons-update
, fait la même chose.Beaucoup de gens utilisent l'étape n presets. L'étape 3 est assez conservatrice. Cela fonctionne dans toutes les étapes jusqu'à 3 inclus.
OriginalL'auteur Distortum
Solution précédente - est antipattern, car il changer cela.état. C'est faux!
Utiliser cette (ancienne):
Ou de l'utilisation ES6 sucre:
Assez doux, n'est-ce pas? ))
Dans le vieux-Réagir la syntaxe (l'original, pas ES6), ce qui a
this.replaceState
, que supprimer les clés inutiles en magasin, mais maintenant il est obsolèteObject.assign()
ne pas faire une profonde clone, de sorte que vous pourriez modifier directement l'état sans le vouloir en plus complexe apps. Le deuxième problème se produit dans les deux de vos solutions et c'est la même que la réponse de @alexandre-t. Vous n'êtes pas le retrait de la clé deObject.keys()
comme demandé. Vous êtes juste en changeant sa valeur.Cette rubrique n'a pas de signification émotionnelle pour moi et personne ne peut voter deux fois. J'ai voté votre réponse une fois parce que ça ne résout pas le problème posé par la question. Je ne suis pas sûr de savoir comment cela résout aucun problème, cependant. Si vous itérer sur les propriétés de l'objet de l'état pour créer une liste ou un tableau, la définition de la valeur de l'un d'eux à
null
/undefined
permettra au moins de générer une liste vide ou de l'élément de ligne de la table. Si le code est écrit pour utiliser les propriétés des objets enfants, le réglage de la valeur denull
/undefined
va conduire à des erreurs qui sont difficiles à résoudre.OriginalL'auteur MiF
Dans
ReactCompositeComponent.js
dans la Réagir la source sur GitHub est une méthode appelée_processPendingState
, qui est la méthode qui met en œuvre la fusion de l'état à partir d'appels sur le composant.setState;``
_processPendingState: function(accessoires, context) {
var inst = ce._instance;
var file = ce._pendingStateQueue;
var replace = ce._pendingReplaceState;
c'._pendingReplaceState = false;
c'._pendingStateQueue = null;
``
Dans ce code, vous pouvez voir la ligne qui met en œuvre la fusion;
Nulle part dans cette fonction, est-il un appel à
delete
ou similaires, ce qui signifie qu'il n'est pas vraiment l'intention de comportement. Aussi, complètement copie de l'état, la suppression de la propriété, et de l'appel de setState ne fonctionnera pas parce que setState est toujours une opération de fusion, de sorte que la propriété supprimée sera simplement ignoré.Note également que setState ne fonctionne pas immédiatement, mais les lots de changements, donc, si vous essayez de cloner l'ensemble de l'état de l'objet et faire seulement un changement de propriété, vous pouvez essuyer des précédents appels à setState. Comme Réagir document dit;
Ce que vous pourriez chercher à faire est d'ajouter plus d'infos;
C'est moche, d'accord, mais il vous donne la pièce supplémentaire de l'info, vous avez besoin de faire la distinction entre une valeur indéfinie, et une valeur non définie. De Plus il joue de nice à Réagir lui-même, des transactions, de modification de l'état de traitement par lots, et tout autre horreur. Mieux vaut prendre un peu plus de complexité ici que d'essayer de deviner Réagit internes, qui sont pleins d'horreurs comme les transactions de la réconciliation, de la gestion des fonctions obsolètes comme replaceState, etc
OriginalL'auteur Steve Cooper
Si la suppression est dans une fonction, et la clé doit être une variable, essayez ceci :
Presque le même que steve réponse, mais dans une fonction.
OriginalL'auteur Taj Virani
Si vous souhaitez réinitialiser complètement l'état (en supprimant un grand nombre d'éléments), quelque chose comme cela fonctionne:
À l'aide de cette variante de
setState
vous permet d'accéder à l'ensemble de l'état au cours de l'appel, alors quethis.state
pourrait être un peu hors de date (due à l'avantsetState
appels n'ayant pas encore été entièrement traitée).OriginalL'auteur Malvineous
Je pense que c'est une belle façon d'aller à ce sujet =>
OriginalL'auteur Robi Moller