J'utilise React Native
Pour mon application, et à un moment donné, j'ai remarqué que je dois taper this.state.bar[this.state.foo][SOME_NUMBER]
À chaque fois, dans mes composants.
Cela fonctionne parfaitement, mais je veux rendre mon code plus propre en appelant une fonction à la place. J'ai donc construit ceci:
function txt(n){
return this.state.bar[this.state.foo][n];
}
Cependant, lorsque j'exécute cela dans le client Expo
, j'obtiens l'erreur suivante:
TypeError: undefined is not an object (evaluating 'this.state.bar')
This error is located at:
in App...
....
Voici tout mon code.
import React,
{ Component }
from 'react';
import {
...
} from 'react-native';
export default class App extends React.Component {
state = {
foo: 'ABC',
bar: {
'ABC': [
'...',
'...',
'...'
]
}
};
render() {
function txt(n){
return this.state.bar[this.state.foo][n];
}
return (
<View>
...
</View>
);
}
}
J'ai essayé de placer la fonction text()
en dehors de la classe App
, mais j'ai eu la même erreur.
Lorsque je l'ai placé en dehors de render()
dans App
, j'ai eu une erreur unexpected token
.
Lorsque j'ai défini this.state
Dans une constructor(props)
et placé text()
dans la constructor
, j'ai obtenu ReferenceError: Can't find variable: text
Votre problème est lié à la portée.
La this
à laquelle vous essayez d'accéder à l'intérieur de la fonction txt()
pointe vers sa propre this
, et non le composant externe this
.
Il existe plusieurs façons de résoudre ce problème. en voici quelques uns:
Vous pouvez transformer txt
en une fonction de flèche pour utiliser le this
externe:
render() {
const txt = (n) => {
return this.state.bar[this.state.foo][n];
}
return (
<View>
...
</View>
);
}
this
externerender() {
function _txt(n){
return this.state.bar[this.state.foo][n];
}
const txt = _txt.bind(this);
return (
<View>
...
</View>
);
}
this
externerender() {
const self = this;
function txt(n){
return self.state.bar[self.state.foo][n];
}
return (
<View>
...
</View>
);
}
txt
vers l'extérieur de la fonction de rendu et la lier au composant this
.this
du composant.... et je suis sûr qu'il existe plusieurs autres façons de résoudre ce problème. Vous avez juste besoin de savoir quand vous utilisez le this
ou un autre this
du composant.
Quelques problèmes ici. Tout d'abord, vous devez lier la fonction text
à la classe du constructeur. Vous devez également déplacer la fonction text
hors de la méthode de rendu et l'ajouter en tant que méthode de classe (pas de function
devant le nom de la fonction):
import React,
{ Component }
from 'react';
import {
...
} from 'react-native';
export default class App extends React.Component {
constructor () {
super();
this.state = {
foo: 'ABC',
bar: {
'ABC': [
'...',
'...',
'...'
]
}
};
this.text = this.text.bind(this);
}
text (n) {
return this.state.bar[this.state.foo][n];
}
render() {
return (
<View>
...
</View>
);
}
}