J'ai une question relavent à ce code: https://github.com/reactjs/redux/blob/master/examples/async/containers/App.js
plus précisément:
constructor(props) {
super(props)
this.handleChange = this.handleChange.bind(this)
this.handleRefreshClick = this.handleRefreshClick.bind(this)
}
Je suppose que c'est une question en 2 parties.
this.handleChange =
, ne puis-je pas simplement utiliser des fonctions statiques pour handleChange et l'appeler directement avec dans la classe onClick={handleRefreshClick}>
?this.handleRefreshClick.bind(this)
Merci
Répondu dans l'ordre inverse ...
this.handleRefreshClick.bind(something)
renvoie une nouvelle fonction dans laquelle les références à this
feront référence à something
. C'est un moyen de sauvegarder la valeur actuelle de this
, qui est dans la portée lors de l'appel au constructeur, afin qu'elle puisse être utilisée ultérieurement lors de l'appel de la fonction.L'argument en faveur de l'ajout de ces lignes au constructeur est tel que les nouvelles fonctions liées ne sont créées qu'une fois par instance de la classe. Vous pouvez aussi utiliser
onClick={this.handleRefreshClick.bind(this)}
ou (ES6):
onClick={() => this.handleRefreshClick()}
mais l'une ou l'autre de ces méthodes créera une nouvelle fonction chaque fois que le composant sera rendu de nouveau.
La raison pour laquelle cela est fait est de lier le mot clé this
à cet objet. Comme Tom l'a dit, appeler une fonction depuis une classe ne signifie pas qu'elle soit appelée avec le contexte de l'objet qui a créé cette fonction.
Je pense que vous risquez de vous embrouiller parce que, dans les exemples/tutoriels de React, l’utilisation de React.createClass () LIE lier this
automatiquement. Vous vous demandez peut-être pourquoi React.createClass () le fait, mais pas avec la syntaxe de classe ES6.
En effet, React ne souhaitait pas modifier les spécifications ES6 (la liaison this
aux fonctions de sa classe n’était pas conforme à la spécification de la classe ES6), mais souhaitait en même temps offrir à ses utilisateurs le confort de la classe ES6. syntaxe. Vous pouvez en savoir plus à ce sujet ci-dessous.
J'espère que cela permet de comprendre pourquoi cela se produit.
Ces 2 fonctions handleChange et handleRefreshClick sont transmises comme accessoires aux autres composants,
Ils sont liés à cela car lorsque le composant enfant appellera ces fonctions, ils seront toujours exécutés avec le contexte APP.
Vous pouvez supprimer ces fonctions de la classe, mais vous devez néanmoins le lier car vous mettriez à jour certaines parties de votre APP.
this
dépend comment la fonction est appelée, pas comment/où elle est créée.
Quand vous regardez le code, vous voyez deux "ceci", pourquoi? Ça semble bizarre, non? ?__. Le problème, c'est qu'il ne s'agit pas de ce que cela semble être. C'est à propos de comment ça s'appelle.
Vous dites fondamentalement. Hé, quand quelqu'un vous appelle, rappelez-vous this
signifie cette classe. pas autre chose.
Quand quelqu'un appelle votre classe comme suit: x.yourClass()
, vous dites que this
n'est pas x
, mais la classe elle-même (avec des propriétés et des états, etc.).
Personnellement, je lie les fonctions dans le constructeur pour que leurs références ne changent pas à chaque rendu.
Ceci est particulièrement important si vous transmettez des fonctions à des enfants en lecture seule dont vous n'avez pas besoin d'être mis à jour lorsque leurs accessoires ne changent pas. J'utilise react-addons-pure-render-mixin pour cela.
Sinon, lors de la restitution de chaque parent, une liaison sera établie, une nouvelle référence de fonction sera créée et transmise aux enfants, ce qui va laisser penser que les accessoires ont changé.