React Native ——实现一个简单的抓取github上的项目数据列表

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 */
'use strict';

var React = require('react-native');
var {
  AppRegistry,
  StyleSheet,
  Text,
  Image,
  View,
  TextInput,
  ListView,
} = React;
var GIT_URL = 'https://api.github.com/search/repositories?q=';

var AwesonProject = React.createClass({
  /*--  lifecycle --*/
  getInitialState: function() {
    return {
      // (row1, row2) => row1 !== row2:如果两次的数据不同的话,告诉数据源该数据发生了改变
      dataSource: new ListView.DataSource({
        rowHasChanged: (row1, row2) => row1 !== row2,
      }),
    };
  },
  render: function() {
    var listViewContent;
    if (this.state.dataSource.getRowCount() === 0) {
      listViewContent =
                        <Text>
                          there's nothing to search , please have another key to tap.
                        </Text>;
    } else {
      listViewContent =
                        <ListView
                          ref='listview'
                          dataSource={this.state.dataSource}
                          renderRow={this.renderRow}
                          automaticallyAdjustConntentInsets={false}
                          keyboardShouldPersistTaps={true}
                          showsVerticalScrollIndicator={true} />
    }
    return (
      <View style={styles.container}>
        <TextInput
            autoCapitalize='none'
            autoCorrect={false}
            placeholder='search forr git project...'
            onEndEditing={this.onSearchChange}
            style={styles.searchView}>
        </TextInput>
        {listViewContent}
      </View>
    );
  },

  /*-- private method --*/

  //点击搜索响应数据请求
  onSearchChange: function(event) {
    var serarchText = event.nativeEvent.text.toLowerCase();
    var queryURL = GIT_URL + encodeURIComponent(serarchText);

    fetch(queryURL)
      .then((response) => response.json())
      .then((responseData) => {
        if (responseData.items) {
          this.setState({
            dataSource : this.state.dataSource.cloneWithRows(responseData.items)
          });
        }
      })
      .done();
  },

  //渲染列表中的每一行数据
  renderRow: function(item) {
    return (
      <View>
        <View  style={styles.row}>
          <Image
            source={{uri:item.owner.avatar_url}}
            style={styles.Img}>
          </Image>
          <View>
            <Text style={styles.name}>
              {item.full_name}
            </Text>
            <Text style={styles.name}>
              Star:{item.stargazers_count}
            </Text>
          </View>
        </View>
        <View style={styles.cellBorder}></View>
      </View>
    );
  },

});

/*布局样式*/
var styles = StyleSheet.create({
  container: {
    flex: 1,
    // justifyContent: 'center',
    // alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  searchView:{
    marginTop:30,
    padding:5,
    margin:5,
    fontSize:15,
    height:30,
    backgroundColor:'#EAEAEA'
  },
  row:{
    flexDirection:'row',
    padding:8,
  },
  name:{
    marginBottom:8,
    marginLeft:8,
  },
  Img:{
    width:50,
    height:50,
  },
  cellBorder:{
    height:1,
    marginLeft:2,
    backgroundColor:'#EAEAEA',
  }
});

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