我目前正在编写一个Android React Native应用程序,该应用程序由一个通过Ruby on Rails服务器提供的JSON api提供支持。我目前最大的障碍是保存了fetch
电话的结果。我的代码如下:
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);
我知道这是一个有效的端点,因为如果我使用警报帖,我可以进行相同的呼叫工作,我从here得到了这个想法。我认为问题源于fetch
的异步性质,但我不确定如何解决这个问题。
非常感谢任何帮助!
答案 0 :(得分:0)
以下是保存和访问api调用结果的方法之一。调用api的最佳方式是 componentWillMount 生命周期。在生成Component之前调用此生命周期。
您可以直接在 componentWillMount()上使用api调用,也可以调用您创建的getStatus()函数。
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);