2015-11-29 2 views
15

Ich habe eine Anmeldeseite implementiert, die so lange funktioniert hat, bis ich das reaktionsnative Upgrade durchgeführt habe.TouchableHighlight onPresse funktioniert nicht

Das Problem, das ich habe, ist, dass die onPress prop nicht aufgerufen werden:

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

Hier ist meine Signin Funktion:

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

Die Signin Taste, wenn sie niedergedrückt werden, erscheint I Klicken Sie darauf, aber die Protokollanweisung wird nicht ausgelöst.

Antwort

30

Try es so nennen:

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

Es sieht aus wie die "this" in Ihrer Funktion an den falschen Umfang gebunden ist.

+1

Ich mag diesen Ansatz. Auch erwähnenswert, mein Code hatte this.signIn ohne das(). Es funktioniert auch ohne die Pfeilfunktion. – lernerbot

+0

Ich hatte ein ähnliches Problem: Meine onPress wurde automatisch in einer Bildlaufliste aufgerufen, wenn die Liste gescrollt wurde. Das Hinzufügen der Pfeilfunktion hat es behoben! –

+0

Sie sparen mein Leben. Und es ist genial, die Shorthand-Funktion zu verwenden, um zu vermeiden, dass der SignIn seinen eigenen Bereich hat. Nett! –

5

Sie können es auch tun, wie folgt:

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

der Rest des Codes nicht ändern müssen.

2

Auch, wenn Sie wollen nicht, um den Einsatz zu binden und da wir ES6 Syntax verwenden, könnten Sie Ihre Funktion aus als const (innerhalb Ihrer Komponente) und nicht eine Funktion zB zugeordnet schreiben:

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

dann können Sie es nennen noch die Komponente innerhalb wie Sie bereits sind, ohne in den Konstruktor zu binden oder anderswo:

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

Dies sollte da Signin halten Kontext von „dieser“ consistent an die gebunden werden Komponente nur einmal bei der Initialisierung.

+0

BTW alle drei Methoden sind gültig. Scheint eine Frage der Vorliebe zu sein. –