使用React Native时,如何保存获取的结果?

时间:2016-07-28 04:40:23

标签: ruby-on-rails json react-native fetch

我目前正在编写一个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的异步性质,但我不确定如何解决这个问题。

非常感谢任何帮助!

1 个答案:

答案 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);