React restitue-t-il tous les composants et sous-composants à chaque setState
appel?
Si oui, pourquoi? Je pensais que l'idée était que React rendait aussi peu que nécessaire - lorsque l'état changeait.
Dans l'exemple simple suivant, les deux classes s'affichent à nouveau lorsque vous cliquez sur le texte, malgré le fait que l'état ne change pas lors des clics suivants, car le gestionnaire onClick définit toujours state
la même valeur:
this.setState({'test':'me'});
Je m'attendais à ce que les rendus ne se produisent que si les state
données avaient changé.
Voici le code de l'exemple, en tant que JS Fiddle et extrait de code intégré:
var TimeInChild = React.createClass({
render: function() {
var t = new Date().getTime();
return (
<p>Time in child:{t}</p>
);
}
});
var Main = React.createClass({
onTest: function() {
this.setState({'test':'me'});
},
render: function() {
var currentTime = new Date().getTime();
return (
<div onClick={this.onTest}>
<p>Time in main:{currentTime}</p>
<p>Click me to update time</p>
<TimeInChild/>
</div>
);
}
});
ReactDOM.render(<Main/>, document.body);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.0/react-dom.min.js"></script>
[1]: http://jsfiddle.net/fp2tncmb/2/
javascript
reactjs
Brad Parks
la source
la source
setState()
même avec des données factices entraîne un rendu différent de l'élément, je dirais donc oui. Absolument, il devrait essayer de restituer votre objet lorsque quelque chose a changé, sinon votre démo - en supposant que c'était le comportement prévu - ne fonctionnerait pas!shouldComponentUpdate
méthode, dont j'ai supposé qu'une version simple devait déjà être incluse dans React lui-même. On dirait que la version par défaut incluse dans react renvoie simplementtrue
- ce qui force le composant à être rendu à chaque fois.Réponses:
Par défaut - oui.
Il existe une méthode booléenne shouldComponentUpdate (object nextProps, object nextState) , chaque composant a cette méthode et il est responsable de déterminer "la mise à jour du composant (exécuter la fonction de rendu )?" chaque fois que vous changez d' état ou passez de nouveaux accessoires du composant parent.
Vous pouvez écrire votre propre implémentation de la méthode shouldComponentUpdate pour votre composant, mais l'implémentation par défaut retourne toujours true - ce qui signifie toujours réexécuter la fonction de rendu.
Citation de documents officiels http://facebook.github.io/react/docs/component-specs.html#updating-shouldcomponentupdate
Prochaine partie de votre question:
Il y a deux étapes de ce que nous pouvons appeler le «rendu»:
Rendu DOM virtuel: lorsque la méthode de rendu est appelée, elle retourne une nouvelle structure de dom virtuel du composant. Comme je l'ai mentionné précédemment, cette méthode de rendu est toujours appelée lorsque vous appelez setState () , car shouldComponentUpdate renvoie toujours true par défaut. Donc, par défaut, il n'y a pas d'optimisation ici dans React.
Rendu DOM natif: React ne modifie les nœuds DOM réels dans votre navigateur que s'ils ont été modifiés dans le DOM virtuel et aussi peu que nécessaire - c'est la grande fonctionnalité de React qui optimise la vraie mutation DOM et rend React rapide.
la source
setState
si vous détectez qu'il y a une différence? Si c'est le cas, comment le faire au mieux - comparer les chaînes json, construire et comparer les hachages d'objets, ...?Non, React ne restitue pas tout lorsque l'état change.
Chaque fois qu'un composant est sale (son état a changé), ce composant et ses enfants sont rendus de nouveau. Dans une certaine mesure, cela consiste à restituer le moins possible. Le seul moment où le rendu n'est pas appelé est lorsqu'une branche est déplacée vers une autre racine, où théoriquement nous n'avons pas besoin de restituer quoi que ce soit. Dans votre exemple,
TimeInChild
est un composant enfant deMain
, il est donc également rendu à nouveau lorsque l'état desMain
modifications.React ne compare pas les données d'état. Quand
setState
est appelé, il marque le composant comme sale (ce qui signifie qu'il doit être restitué). La chose importante à noter est que bien que larender
méthode du composant soit appelée, le vrai DOM n'est mis à jour que si la sortie est différente de l'arborescence DOM actuelle (c'est-à-dire la différence entre l'arborescence DOM virtuelle et l'arborescence DOM du document). Dans votre exemple, même si lesstate
données n'ont pas changé, l'heure de la dernière modification a changé, ce qui rend le DOM virtuel différent du DOM du document, d'où la raison pour laquelle le HTML est mis à jour.la source
render()
méthode soit "pure" - indépendante de l'état extérieur.some branch is moved to another root
? Comment appelez-vousbranch
? Comment appelez-vousroot
?what does it mean some branch is moved to another root? What do you call branch? What do you call root?
Même si cela est indiqué dans de nombreuses autres réponses ici, le composant doit soit:
implémenter
shouldComponentUpdate
pour rendre uniquement lorsque l'état ou les propriétés changentpasser à l'extension d'un PureComponent , qui implémente déjà une
shouldComponentUpdate
méthode en interne pour les comparaisons superficielles.Voici un exemple d'utilisation
shouldComponentUpdate
, qui ne fonctionne que pour ce cas d'utilisation simple et à des fins de démonstration. Lorsque cette option est utilisée, le composant ne se restitue plus à chaque clic et est rendu lors de son premier affichage et après avoir été cliqué une fois.la source
Oui. Il appelle la méthode render () chaque fois que nous appelons setState à la place lorsque "shouldComponentUpdate" renvoie false.
la source
Une autre raison de la "perte de mise à jour" peut être la suivante:
Si c'est le problème, U peut éviter de définir l'état lors de la mise à jour, vous devez vérifier la valeur du paramètre d'état comme ceci
Une autre solution consiste à ajouter une propriété initialisée à l'état et à la configurer la première fois (si l'état est initialisé à une valeur non nulle).
la source
Pas tous les composants.
le
state
composant in ressemble à la source de la cascade d'état de l'ensemble de l'APP.Ainsi, le changement se produit d'où l'appel de setState. L'arbre est
renders
alors appelé de là. Si vous avez utilisé un composant pur, lerender
sera ignoré.la source