Je reçois l'erreur suivante
TypeError non capturé: impossible de lire la propriété «setState» de non défini
même après liaison delta dans le constructeur.
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {
count : 1
};
this.delta.bind(this);
}
delta() {
this.setState({
count : this.state.count++
});
}
render() {
return (
<div>
<h1>{this.state.count}</h1>
<button onClick={this.delta}>+</button>
</div>
);
}
}
javascript
reactjs
Dangling_pointer
la source
la source
Réponses:
Cela est dû au fait de
this.delta
ne pas y être liéthis
.Afin de lier l'ensemble
this.delta = this.delta.bind(this)
dans le constructeur:Actuellement, vous appelez bind. Mais bind renvoie une fonction liée. Vous devez définir la fonction sur sa valeur liée.
la source
this
liaison lexicale appropriée , puis n'exposent même pas une syntaxe pour lier leur contexte directement sur leur définition!?delta
commedelta = () => { return this.setState({ count: this.state.count++ }); };
le code fonctionnerait également. Expliqué ici: hackernoon.com/…Dans ES7 + (ES2016), vous pouvez utiliser l' opérateur de syntaxe de liaison de la fonction expérimentale
::
pour effectuer la liaison. C'est un sucre syntaxique et fera la même chose que la réponse de Davin Tryon.Vous pouvez ensuite réécrire
this.delta = this.delta.bind(this);
dansthis.delta = ::this.delta;
Pour ES6 + (ES2015), vous pouvez également utiliser la fonction de flèche ES6 + (
=>
) pour pouvoir l'utiliserthis
.Pourquoi ? Du document Mozilla:
la source
Il existe une différence de contexte entre les classes ES5 et ES6. Il y aura donc également une petite différence entre les implémentations.
Voici la version ES5:
et voici la version ES6:
Faites juste attention, à côté de la différence de syntaxe dans l'implémentation de classe, il y a une différence dans la liaison du gestionnaire d'événements.
Dans la version ES5, c'est
Dans la version ES6, c'est:
la source
Lorsque vous utilisez du code ES6 dans React, utilisez toujours les fonctions fléchées, car ce contexte est automatiquement lié à celui-ci
Utilisez ceci:
au lieu de:
la source
this.setState({videos});
Vous n'avez rien à lier, utilisez simplement les fonctions fléchées comme ceci:
la source
Vous pouvez aussi utiliser:
Ou:
Si vous passez quelques paramètres ..
la source
Vous devez le lier au constructeur et n'oubliez pas que les modifications apportées au constructeur doivent redémarrer le serveur. Sinon, vous finirez avec la même erreur.
la source
Vous devez lier vos méthodes avec 'this' (objet par défaut). Donc, quelle que soit votre fonction, il suffit de la lier dans le constructeur.
la source
Cette erreur peut être résolue par différentes méthodes -
Si vous utilisez la syntaxe ES5 , selon la documentation React js, vous devez utiliser la méthode bind .
Quelque chose comme ça pour l'exemple ci-dessus:
this.delta = this.delta.bind(this)
Si vous utilisez la syntaxe ES6 , vous n'avez pas besoin d'utiliser la méthode bind , vous pouvez le faire avec quelque chose comme ceci:
delta=()=>{ this.setState({ count : this.state.count++ }); }
la source
Il existe deux solutions à ce problème:
La première solution consiste à ajouter un constructeur à votre composant et à lier votre fonction comme ci-dessous:
Faites donc ceci:
Au lieu de cela:
La deuxième solution consiste à utiliser une fonction flèche à la place:
En fait, la fonction de flèche ne lie pas la sienne
this
. Fonctions flèches lexicalementbind
leur contextethis
se réfère donc en fait au contexte d'origine .Pour plus d'informations sur la fonction de liaison:
Fonction Bind Comprendre JavaScript Bind ()
Pour plus d'informations sur la fonction flèche:
Javascript ES6 - Fonctions fléchées et lexical
this
la source
vous devez lier un nouvel événement avec ce mot - clé comme je le mentionne ci-dessous ...
la source
Ajouter
va résoudre le problème. cette erreur survient lorsque nous essayons d'appeler la fonction de la classe ES6, nous devons donc lier la méthode.
la source
La fonction flèche aurait pu vous faciliter la vie pour éviter de lier ce mot - clé. Ainsi:
la source
bien que cette question ait déjà une solution, je veux juste partager la mienne pour qu'elle soit clarifiée, j'espère qu'elle pourrait aider:
la source
la source
Changez simplement votre instruction bind de ce que vous avez à => this.delta = this.delta.bind (this);
la source
2. Vérifiez le (this) si vous faites setState dans une fonction (ie handleChange) vérifiez si la fonction est liée à ceci ou si la fonction doit être une fonction de flèche.
## 3 façons de le lier à la fonction ci-dessous ##
la source
si vous utilisez la syntaxe ES5, vous devez la lier correctement
et si vous utilisez ES6 et au- dessus , vous pouvez utiliser la fonction flèche, vous n'avez pas besoin d'utiliser bind () , il
la source