私はアプリケーションに_React Native
_を使用していますが、ある時点で、コンポーネント内で毎回_this.state.bar[this.state.foo][SOME_NUMBER]
_を入力する必要があることに気付きました。
これは完璧に機能しますが、代わりに関数を呼び出してコードをよりクリーンにしたいと考えています。だから、私はこれを構築しました:
_function txt(n){
return this.state.bar[this.state.foo][n];
}
_
ただし、これをExpo
クライアントで実行すると、次のエラーが発生します。
_TypeError: undefined is not an object (evaluating 'this.state.bar')
This error is located at:
in App...
....
_
これが私のコード全体です。
_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>
);
}
}
_
text()
関数をApp
クラスの外に配置しようとしましたが、同じエラーが発生しました。
App
のrender()
の外側に配置すると、_unexpected token
_エラーが発生しました。
_this.state
_をconstructor(props)
内に定義し、text()
をconstructor
内に配置すると、_ReferenceError: Can't find variable: text
_が得られました
あなたの問題はスコープです。
txt()
関数内でアクセスしようとしているthis
は、外部コンポーネントthis
ではなく、独自のthis
を指しています。
これを修正する方法はいくつかあります。ここにいくつかあります:
txt
を矢印関数に変換して、外側のthis
を使用できます。
render() {
const txt = (n) => {
return this.state.bar[this.state.foo][n];
}
return (
<View>
...
</View>
);
}
this
を使用できます。render() {
function _txt(n){
return this.state.bar[this.state.foo][n];
}
const txt = _txt.bind(this);
return (
<View>
...
</View>
);
}
this
を指す追加の変数を作成できますrender() {
const self = this;
function txt(n){
return self.state.bar[self.state.foo][n];
}
return (
<View>
...
</View>
);
}
txt
関数をrender関数の外に移動して、コンポーネントthis
にバインドできます。this
にバインドしたように見えます。...そしてこの振る舞いを修正する方法は他にもいくつかあると確信しています。コンポーネントのthis
または他のthis
をいつ使用するかを知る必要があるだけです。
ここにいくつかの問題があります。最初に、コンストラクタでtext
関数をクラスにバインドする必要があります。また、text
関数をrenderメソッドの外に移動して、クラスメソッドとして追加する必要があります(関数名の前にfunction
はありません)。
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>
);
}
}