2017-09-15 3 views
1

Funktion kann nicht innerhalb von render aufgerufen werden. Meine Komponente ist:Aufruf der Funktion im Render funktioniert nicht

class MyComp extends Component { 
    componentWillMount() { 
    this.props.getUsers(); 
    }; 

    getUsersfunction(users){ 
    return(
     console.log("i was called"); 
    users.map((user, idx) => { 
     return (
     <View key={idx}> 
      <Text style={styles.userNames}> ID: {user.id} - Name: {user.name} </Text> 
     </View> 
     ) 
     }); 
    ) 
    }; 


    render() { 
    console.log("USERS: ", this.props.users); 
    const { users } = this.props.users 

    return (
     <View style={styles.container}> 
     <ScrollView> 
      { users.length ? (
       {this.getUsersfunction(users)} // <= Is this the correct way? 
      ) : null } 
     </ScrollView> 
     </View> 
    ); 
    } 
} 

// mapStatetoProps and mapDispatchToProps here. 

export default connect(mapStateToProps, mapDispatchToProps) (MyComp); 

Fehler ist this ein reserviertes Wort ist. Console.log sät alle Benutzer in einem Array. Was mache ich falsch?

+0

'getUsersfunction' nichts zur Zeit zurückkehrt. Möglicherweise möchten Sie eine Rückgabeanweisung hinzufügen. – Brian

+0

Aktualisierte Frage. Es war mein Fehler hier. Der ursprüngliche Code hat die Rückgabe. Immer noch wird nichts zurückgegeben. Aber Konsolenprotokolle '" ich wurde genannt "' – Somename

Antwort

0

James Emanon ganz korrekt ist.

Aber wenn ich Sie wäre, würde ich die Logik verschieben, um zu überprüfen, ob es etwas zu rendern gibt oder nicht in der Funktion selbst.

getUsersfunction(){ 
    const { users } = this.props.users 

    if(!users) 
    return null; 

    return(
     console.log("i was called"); 
     users.map((user, idx) => { 
      return (
      <View key={idx}> 
       <Text style={styles.userNames}> ID: {user.id} - Name: {user.name} </Text> 
      </View> 
      ) 
     }); 
    ) 
}; 

Und dann Render wird viel sauberer:

<ScrollView> 
    {this.getUsersfunction()} 
</ScrollView> 

Ein weiterer refactor ich vorschlagen würde, ist, da Sie bereits Benutzer in this.props haben Sie brauchen, um sie nicht durch params passieren, so Sie können es direkt in Ihrer Funktion verwenden.

Ihre Funktion Bindung ist auch wichtig, auch wenn reagiert nicht, dass vier Sie, je nach Kontext, wo man tatsächlich ist es verloren gehen könnte:

constructor() { 
    this.getUsersFunction = this.getUsersFunction.bind(this) 
} 

Auf diese Weise werden Sie Fehler nicht erhalten, aber wenn Sie können dann Benutzer nicht rendern, Sie müssen anfangen zu bewerten, ob es wirklich etwas zu rendern gibt.

1

Sie brauchen nicht die geschweiften Klammern:

{ users.length ? (
    this.getUsersfunction(users) // Now it's correct 
) : null } 
+4

Um klar zu sein; Geschweifte Klammern geben an, wann Sie JS in einen JSX-Kontext einfügen möchten. Wenn Sie sich jedoch bereits in einem JS-Kontext befinden, stellen die geschweiften Klammern ein JSON-Objekt dar. Der ursprüngliche Code gab ein JSON-Objekt zurück, das versuchte, eine Variable mit dem Namen 'this.getUsersfunction (users) 'zu setzen, was eindeutig nicht funktionieren sollte. – gravityplanx

+0

Versuchte das. Erhalten Sie keinen Fehler, aber nichts wird zurückgegeben. Aber Konsolenlogs '" Ich wurde "' genannt. Die betreffende Funktion wurde aktualisiert. Vielen Dank. – Somename

+1

Sie müssen die Konsole von der Rückkehr entfernen. Setzen Sie die console.log-Anweisung über die Rückgabe –

2

Oder ein wenig kürzer, durch diese geschweiften Klammern hinzugefügt, erstellt man einen anderen Rückgabetyp Objekt statt den gewünschten jsx.

<ScrollView> 
    { users.length && this.getUsersfunction(users) } 
</ScrollView> 
0

Sie haben vergessen zu bindgetUsersFunction Methode im Konstruktor des Komponente:

constructor() { 
    this.getUsersFunction = this.getUsersFunction.bind(this) 
} 

render() { 
    const { users } = this.props.users 

    return (
    <View style={styles.container}> 
     <ScrollView> 
     { users.length && this.getUsersfunction(users) } 
     </ScrollView> 
    </View> 
) 
} 
0

haben Sie const { users } = this.props.users

aber Sie haben sollte const { users } = this.props

Verwandte Themen