J'ai parfois des composants de réaction qui sont conceptuellement avec état que je souhaite réinitialiser. Le comportement idéal équivaudrait à supprimer l'ancien composant et à lire un nouveau composant vierge.
React fournit une méthode setState
qui permet de définir le propre état explicite des composants, mais qui exclut l'état implicite tel que le focus du navigateur et l'état du formulaire, et il exclut également l'état de ses enfants. Attraper tout cet état indirect peut être une tâche délicate, et je préférerais le résoudre de manière rigoureuse et complète plutôt que de jouer à un coup de taupe avec chaque nouvel état surprenant.
Existe-t-il une API ou un modèle pour faire cela?
Edit: J'ai fait un exemple trivial démontrant l' this.replaceState(this.getInitialState())
approche et la contrastant avec l' this.setState(this.getInitialState())
approche: jsfiddle - replaceState
est plus robuste.
key
dans ce cas.)replaceState()
etgetInitialState()
sont tous deux obsolètes dans les nouveaux reactjs de style classe ES6. Utilisezthis.setState(this._getInitialState())
plutôt. De plus, vous ne pouvez pas nommer votre propre fonction d'initialisation d'étatgetInitialState()
- react jette un avertissement - appelez-la autrement et faites-le explicitementstate = this._getInitialState()
au niveau supérieur de la classe.Vous devriez en fait éviter
replaceState
et utiliser à lasetState
place.La documentation indique que
replaceState
"peut être entièrement supprimé dans une future version de React". Je pense qu'il sera très certainement supprimé carreplaceState
ne correspond pas vraiment à la philosophie de React. Cela facilite le fait qu'un composant React commence à se sentir un peu comme un couteau suisse. Cela empêche la croissance naturelle d'un composant React de devenir plus petit et plus conçu à cet effet.Dans React, si vous devez vous tromper sur la généralisation ou la spécialisation: visez la spécialisation. En corollaire, l'arborescence des états de votre composant doit avoir une certaine parcimonie (c'est bien d'enfreindre cette règle avec goût si vous échafaudez un nouveau produit de marque).
Quoi qu'il en soit, c'est comme ça que vous faites. Similaire à la réponse (acceptée) de Ben ci-dessus, mais comme ceci:
Aussi (comme Ben l'a également dit) afin de réinitialiser "l'état du navigateur", vous devez supprimer ce nœud DOM. Exploitez la puissance du vdom et utilisez un nouvel
key
accessoire pour ce composant. Le nouveau rendu remplacera ce composant en gros.Référence: https://facebook.github.io/react/docs/component-api.html#replacestate
la source
this.replaceState
? Parce que ça l'est.getInitialState()
(par exemple, dans un gestionnaire onClick). Dans ce cas, cette nouvelle propriété serait toujours présente après le 2getInitialState()
.getInitialState
. Un peu comme déclarer toutes vos variables dans une fonction JS en haut de la fonction. Note latérale: la solution de Ben Alpert est presque identique à la mienne ... et c'est un mainteneur officiel de React!L'ajout d'un
key
attribut à l'élément que vous devez réinitialiser le rechargera à chaque fois que leprops
ou l'state
associé à l'élément changera.Voici un exemple:
la source