2016-07-28 30 views
0

Ich schreibe gerade eine Android React Native App, die von einer JSON API bedient wird, die über einen Ruby on Rails Server bedient wird. Mein größter Fehler hat derzeit die Ergebnisse eines fetch Anrufs gespeichert. Mein Code ist wie folgt:Wie können Sie die Ergebnisse eines Abrufs bei der Verwendung von Native React speichern?

import React, { Component } from 'react'; 
import { 
    AppRegistry, 
    StyleSheet, 
    Text, 
    View, 
    TouchableHighlight, 
    Alert 
} from 'react-native'; 

class MiniMinionClient extends Component { 
    constructor(props) { 
    super(props); 
    } 

    getStatus() { 
    return fetch('http://10.0.2.2:3000/api/v1/status.json') 
     .then((response) => response.json()) 
     .then((responseJson) => { 
     return responseJson; 
     }) 
     .catch((error) => { 
     console.error(error); 
     }); 
    } 

    render() { 
    var status = this.getStatus() 
    return (
     <View style={styles.container}> 
     <Text>Version {status.version}</Text> 
     <Text>Last Update: {status.last_update}</Text> 
     </View> 
    ); 
    } 
} 

const styles = StyleSheet.create({ 
    container: { 
     flex: 1, 
     flexDirection: 'row', 
     justifyContent: 'center', 
     alignItems: 'center', 
     backgroundColor: '#F5FCFF', 
    } 
}); 

AppRegistry.registerComponent('MiniMinionClient',() => MiniMinionClient); 

Ich weiß, dass dies ein gültiger Endpunkt ist, wie ich in der Lage war, die gleiche Anruf Arbeit zu machen, wenn ich alert Beiträge verwenden, die ich auf die Idee von here bekam. Ich denke, das Problem rührt von der asynchronen Natur von fetch her, aber ich bin mir nicht sicher, wie ich das umgehen soll.

Jede Hilfe wäre sehr willkommen!

+0

Können Sie die Ausgabe von 'responseJson' oder die Daten der JSON-Datei bereitstellen? Ich kann Ihnen den vollen Arbeitscode zur Verfügung stellen, wenn ich das Format kenne. –

+0

Der Wert, der als Ergebnis der Funktion zurückkommt, ist ein Promise-Objekt und die Daten der JSON-Datei sind { "Version": "0.0.1", "last_update": "27.07.2016 um 06:15 " " – Riizu

Antwort

1

Hier ist eine der Möglichkeiten zu speichern und Zugriff auf das Ergebnis Ihrer API-Anrufe. Der beste Weg, um Ihre API aufzurufen ist von componentWillMount Lebenszyklus. Dieser Lebenszyklus wird kurz vor dem Rendern der Komponente aufgerufen.

Sie können Ihren API-Anruf entweder direkt unter componentWillMount() verwenden oder die von Ihnen erstellte Funktion getStatus() aufrufen.

import React, { Component } from 'react'; 
import { 
    AppRegistry, 
    StyleSheet, 
    Text, 
    View, 
    TouchableHighlight, 
    Alert 
} from 'react-native'; 

class MiniMinionClient extends Component { 
    constructor(props) { 
    super(props); 
    // Initialize empty state here 
    this.state = { 
     version: '', 
     last_update: '' 
    }; 
    } 
    componentWillMount() { 
    // It's best to use your api call on componentWillMount 
    this.getStatus(); 
    } 

    getStatus() { 
    fetch('http://10.0.2.2:3000/api/v1/status.json') 
     .then((response) => response.json()) 
     .then((responseJson) => { 
     // set the state of the output here 
     this.setState({ 
      version: responseJson.version, 
      last_update: responseJson.last_update 
     }); 
     }) 
     .catch((error) => { 
     console.error(error); 
     }); 
    } 

    render() { 
    return (
     <View style={styles.container}> 
     {/*You can now access the values using this.state here*/} 
     <Text>Version {this.state.version}</Text> 
     <Text>Last Update: {this.state.last_update}</Text> 
     </View> 
    ); 
    } 
} 

const styles = StyleSheet.create({ 
    container: { 
    flex: 1, 
    flexDirection: 'row', 
    justifyContent: 'center', 
    alignItems: 'center', 
    backgroundColor: '#F5FCFF', 
    } 
}); 

AppRegistry.registerComponent('MiniMinionClient',() => MiniMinionClient); 
+0

Vielen Dank! Das hat den Trick gemacht. Mein Mangel an Erfahrung mit JS, Async und React Native macht dies zu einer Herausforderung. Ich schätze deine Hilfe. – Riizu

+0

Während ich mehr Forschung machte, stieß ich auch auf diesen Posten [hier] (http://stackoverflow.com/questions/37035423/react-native-fetch-api-notreturning-my-calls). Dieser verwendet componentDidMount() im Vergleich zu componentWillMount(), sind diese gleich, oder bieten sie unterschiedliche Vorteile? – Riizu

+0

Sie sollten mehr über ** React Lifecycle ** erfahren. Dies ist eines der wichtigsten Themen, die Sie beachten müssen. Es gibt einen Unterschied zwischen diesen beiden: ** ComponentWillMount ** wird vor dem Rendern sowohl auf Server- als auch auf Clientseite ausgeführt. ** componentDidMount ** wird nach dem ersten Rendern nur auf der Client-Seite ausgeführt. Diese Links sind hilfreich: http://javascript.tutorialhorizon.com/2014/09/13/execution-sequence-of-a-react-components-lifecycle-methods/ http://www.tutorialspoint.com/reactjs /reactjs_component_life_cycle.htm –