2015-11-29 8 views
15

私は、反応ネイティブにアップグレードするまで、機能したサインインページを実装しました。TouchableHighlight onPressが機能しない

私がいる問題は、たonPressプロップが呼び出されていないということである。ここでは

<TouchableHighlight style={styles.button} 
     underlayColor='#f1c40f' 
     onPress={this.signIn}> 
    <Text style={styles.buttonText}>Sign In</Text> 
</TouchableHighlight> 

は私のサインイン機能である:

signIn: function(){ 
console.log("SignInAction signIn") 
this.fetchData(); }, 

サインインボタンをとき、私落ち込んでいるように見えますそれをクリックしますが、ログステートメントは起動していません。

答えて

30

はこのようにそれを呼び出して試してみてください。

onPress={() => this.signIn() }> 

それは「これは」あなたの関数に間違った範囲にバインドされているように見えます。

onPress={this.signIn.bind(this)}> 

残りのコード変更を必要としない:

+1

私はこのアプローチが好きです。また、私のコードはthis.signInが()なしであったことにも注意してください。それは矢印機能なしでも機能します。 – lernerbot

+0

私も同様の問題がありました。私のonPressは、スクロールリストがスクロールされたときに自動的に呼び出されました。矢印機能を追加すると修正されました! –

+0

あなたは私の人生を保存します。また、独自のスコープを持つsignInを避けるために省略表現関数を使用することは賢明です。ニース! –

5

あなたも、このようにそれを行うことができます。また

2

、あなたがしたい利用バインドしないと、我々はES6の構文を使用していることから、あなたは(あなたのコンポーネント内)constはなく、関数などとして割り当てられ、あなたの関数を書くことができた場合:

signIn =() => { 
    // code here 
} 

すでにコンストラクタ内または他の場所に結合することなく、あるように、あなたはまだコンポーネント以内にそれを呼び出すことができます。

<TouchableHighlight style={styles.button} 
     underlayColor='#f1c40f' 
     onPress={this.signIn}> 
    <Text style={styles.buttonText}>Sign In</Text> 
</TouchableHighlight> 

これは「この」以来一貫サインインがにバインドされるのコンテキストを維持する必要があります成分初期化時に1回だけです。

+0

BTWの3つの方法はすべて有効です。好みの問題と思われる。 –