React.js: onClick fonction de l'enfant à parent
J'ai utilisé cette article comme un exemple (Réagir), mais il ne fonctionne pas pour moi. Merci de m'indiquer mon erreur, que je ne comprends pas quel est le problème.
C'est l'erreur que je vois:
Uncaught TypeError: ce.accessoires de jeu.onClick n'est pas une fonction
Voici mon code:
//PARENT
var SendDocModal = React.createClass({
getInitialState: function() {
return {tagList: []};
},
render: function() {
return (
<div>
{
this.state.tagList.map(function(item) {
return (
<TagItem nameProp={item.Name} idProp={item.Id} onClick={this.HandleRemove}/>
)
})
}
</div>
)
},
HandleRemove: function(c) {
console.log('On REMOVE = ', c);
}
});
//CHILD
var TagItem = React.createClass({
render: function() {
return (
<span className="react-tagsinput-tag">
<span>{this.props.nameProp}</span>
<a className='react-tagsinput-remove' onClick={this.HandleRemove}></a>
</span>
)
},
HandleRemove: function() {
this.props.onClick(this);
}
});
Merci d'avance!
Qu'est-ce exactement ne fonctionne pas?
Oups! désolé.J'ai toujours une erreur: Uncaught TypeError: ce.accessoires de jeu.onClick n'est pas une fonction
Oups! désolé.J'ai toujours une erreur: Uncaught TypeError: ce.accessoires de jeu.onClick n'est pas une fonction
OriginalL'auteur user2787338 | 2015-07-22
Vous devez vous connecter pour publier un commentaire.
Le problème est que
this
à l'intérieur de lamap
de rappel ne fait pas référence au Réagir composant, doncthis.HandleRemove
estundefined
.Vous pouvez définir la
this
valeur explicitement par le passage d'un deuxième argument àmap
:Maintenant
this
à l'intérieur de le rappel se réfère à la même valeur quethis
à l'extérieur le rappel, à savoir laSendDocModal
instance.Cela n'a rien à voir avec Réagir, c'est juste du fonctionnement de JavaScript. Voir Comment accéder à la corriger " ce " contexte à l'intérieur d'un rappel? pour plus d'info et d'autres solutions.
Désolé, tout simplement confondu forEach et carte. C'est la même solution. Regarde le lien dans ma réponse pour en savoir plus sur
this
.Si j'ai bien compris je doit faire quelque chose comme ceci:
code {this.state.tagList.map(function(item){ return( <TagItem nameProp={item.Name} idProp={item.Id} contextProp={this} onClick={this.HandleRemove}/> ) }, this)},
mais dans ce cas j'obtiens le même : Uncaught TypeError: ce.accessoires de jeu.contextProp.accessoires de jeu.onClick n'est pas une fonctionNon, juste de mettre en œuvre la solution dans ma réponse. Le corps de la fonction de rappel reste le même.
aha, maintenant je l'ai eu. le code sera:
code {this.state.tagList.map(function(item){ return( <TagItem nameProp={item.Name} idProp={item.Id} onClick={this.HandleRemove}/> ) }, this)}
OriginalL'auteur Felix Kling
Essayez ce qui suit:
Quelques modifications:
Ajouté " il " après la liste mappage. Pour être honnête, je ne suis pas entièrement sûr de savoir pourquoi - peut-être plus programmeur expérimenté peut nous le dire.
Ajout d'une clé de chaque TagItem. Il est recommandé de le et la console va vous informer que vous devriez le faire de sorte que si les modifications de l'état, de Réagir pouvez suivre chaque article en conséquence.
Le clic est passé à travers les accessoires. Voir Réagir js - de la difficulté à créer une liste de choses à faire
Pas de problème. Découvrez ceci: github.com/getify/You-Dont-Know-JS/blob/master/...
Merci! sera absolument le lire!
OriginalL'auteur AndrewB