Je suis nouveau dans React et j'essaie d'écrire une application fonctionnant avec une API. Je reçois toujours cette erreur:
TypeError: this.setState n'est pas une fonction
lorsque j'essaie de gérer la réponse de l'API. Je soupçonne que quelque chose ne va pas avec cette liaison, mais je ne sais pas comment y remédier. Voici le code de mon composant:
var AppMain = React.createClass({
getInitialState: function() {
return{
FirstName: " "
};
},
componentDidMount:function(){
VK.init(function(){
console.info("API initialisation successful");
VK.api('users.get',{fields: 'photo_50'},function(data){
if(data.response){
this.setState({ //the error happens here
FirstName: data.response[0].first_name
});
console.info(this.state.FirstName);
}
});
}, function(){
console.info("API initialisation failed");
}, '5.34');
},
render:function(){
return (
<div className="appMain">
<Header />
</div>
);
}
});
javascript
reactjs
Ivan
la source
la source
Vous pouvez éviter d'avoir besoin de .bind (ceci) avec une fonction de flèche ES6.
la source
onChange={(checked) => this.toggleCheckbox()}
, 2)onChange={this.toggleCheckbox.bind(this)}
..bind(this)
, il définit la valeur dethis
dans le contexte parent d'où ilthis.toggleCheckbox()
est appelé, sinon ilthis
ferait référence à l'endroit où il a été réellement exécuté. b) La solution Fat Arrow fonctionne car elle conserve la valeur dethis
, donc elle vous aide en ne modifiant pas violemment la valeur dethis
. En JavaScript,this
se réfère simplement à la portée actuelle, donc si vous écrivez une fonction,this
c'est cette fonction. Si vous y mettez une fonction,this
c'est à l'intérieur de cette fonction enfant. Les flèches grasses gardent le contexte d'où appelévous pouvez également enregistrer une référence à
this
avant d'appeler laapi
méthode:la source
React recommande de lier ceci dans toutes les méthodes qui doivent utiliser ceci
class
plutôt que cecifunction
.Ou vous pouvez utiliser à la
arrow function
place.la source
Vous avez juste besoin de lier votre événement
par exemple
la source
Maintenant, ES6 a la fonction flèche, il est vraiment utile si vous confondez vraiment avec l'expression de liaison (cette), vous pouvez essayer la fonction flèche
Voilà comment je fais.
la source
Vous n'avez pas besoin de l'affecter à une variable locale si vous utilisez la fonction flèche. Les fonctions fléchées prennent automatiquement la liaison et vous pouvez éviter les problèmes liés à la portée.
Le code ci-dessous explique comment utiliser la fonction flèche dans différents scénarios
la source
Maintenant, en réaction avec es6 / 7, vous pouvez lier la fonction au contexte actuel avec une fonction de flèche comme celle-ci, faire une demande et résoudre des promesses comme ceci:
Avec cette méthode, vous pouvez facilement appeler cette fonction dans le componentDidMount et attendre les données avant de rendre votre html dans votre fonction de rendu.
Je ne connais pas la taille de votre projet mais je déconseille personnellement d'utiliser l'état actuel du composant pour manipuler des données. Vous devez utiliser un état externe comme Redux ou Flux ou autre chose pour cela.
la source
utilisez les fonctions fléchées, car les fonctions fléchées pointent vers la portée parent et cela sera disponible. (substitut de la technique de liaison)
la source
Ici, ce contexte change. Utilisez la fonction flèche pour garder le contexte de la classe React.
la source
Si vous faites cela et que vous rencontrez toujours un problème, mon problème est que j'appelais deux variables du même nom.
J'avais
companies
comme objet ramené de Firebase, puis j'essayais d'appelerthis.setState({companies: companies})
- cela ne fonctionnait pas pour des raisons évidentes.la source