React Native 开发越来越火了,web app也是未来的潮流, 现在react native已经可以完成一些最基本的功能. 通过开发一些简单的应用, 可以更加熟练的掌握 RN 的知识. 在学习的过程,发现了一个房产搜索APP的实例,但只有ios版本,

本文主要是房产搜索APP的android版本实现。

原Ios版本

React Native 实例 - 房产搜索App Mystra

原版效果

主要内容:

  • 使用Navigator栈跳转页面.
  • 使用fetch请求网络数据.
  • 使用ListView展示列表数据.

首页搜索

搜索页(SearchPage)包含一个搜索库, 可以使用地址或邮编搜索英国的房产信息.

通过输入框的参数创建网络请求URL, 并把请求发送出去, 获取信息.

  1. /**
  2. * 访问网络服务的Api, 拼接参数
  3. * 输出: http://api.nestoria.co.uk/api?country=uk&pretty=1&encoding=json&listing_type=buy&action=search_listings&page=1&place_name=London
  4. *
  5. * @param key 最后一个参数的键, 用于表示地理位置
  6. * @param value 最后一个参数的值, 具体位置
  7. * @param pageNumber page的页面数
  8. * @returns {string} 网络请求的字符串
  9. */
  10. function urlForQueryAndPage(key, value, pageNumber) {
  11. var data = {
  12. country: 'uk',
  13. pretty: '1',
  14. encoding: 'json',
  15. listing_type: 'buy',
  16. action: 'search_listings',
  17. page: pageNumber
  18. };
  19. data[key] = value;
  20. var querystring = Object.keys(data)
  21. .map(key => key + '=' + encodeURIComponent(data[key]))
  22. .join('&');
  23. return 'http://api.nestoria.co.uk/api?' + querystring;
  24. }
  25. class SearchPage extends Component {
  26. /**
  27. * 构造器
  28. * @param props 状态
  29. */
  30. constructor(props) {
  31. super(props);
  32. this.state = {
  33. searchString: 'London', // 搜索词
  34. isLoading: false, // 加载
  35. message: '' // 消息
  36. };
  37. }
  38. onSearchTextChanged(event) {
  39. this.setState({searchString: event.nativeEvent.text});
  40. console.log(this.state.searchString);
  41. }
  42. /**
  43. * 执行网络请求, 下划线表示私有
  44. * @param query url
  45. * @private
  46. */
  47. _executeQuery(query) {
  48. console.log(query);
  49. this.setState({isLoading: true});
  50. // 网络请求
  51. fetch(query)
  52. .then(response => response.json())
  53. .then(json => this._handleResponse(json.response))
  54. .catch(error => this.setState({
  55. isLoading: false,
  56. message: 'Something bad happened ' + error
  57. }));
  58. }
  59. /**
  60. * 处理网络请求的回调
  61. * @param response 请求的返回值
  62. * @private
  63. */
  64. _handleResponse(response) {
  65. const { navigator } = this.props;
  66. this.setState({isLoading: false, message: ''});
  67. if (response.application_response_code.substr(0, 1) === '1') {
  68. console.log('123');
  69. console.log('Properties found: ' + response.listings);
  70. // 使用listings调用结果页面SearchResults
  71. navigator.push({
  72. title: '搜索结果',
  73. component: SearchResults,
  74. index:1,
  75. params:{
  76. listings:response.listings,
  77. mynav:navigator
  78. }
  79. });
  80. console.log('456');
  81. } else {
  82. this.setState({message: 'Location not recognized; please try again.'});
  83. }
  84. }
  85. /**
  86. * 查询的点击事件
  87. */
  88. onSearchPressed() {
  89. var query = urlForQueryAndPage('place_name', this.state.searchString, 1);
  90. this._executeQuery(query);
  91. }
  92. render() {
  93. var spinner = this.state.isLoading ?
  94. (<ActivityIndicator size='large'/>) : (<View/>);
  95. return (
  96. <View style={styles.container}>
  97. <Text style={styles.description}>
  98. 搜索英国的房产
  99. </Text>
  100. <Text style={styles.description}>
  101. 地址(London)/邮编(W1S 3PR)均可
  102. </Text>
  103. <View style={styles.flowRight}>
  104. <TextInput
  105. style={styles.searchInput}
  106. value={this.state.searchString}
  107. onChange={this.onSearchTextChanged.bind(this)} // bind确保使用组件的实例
  108. placeholder='Search via name or postcode'/>
  109. <TouchableHighlight
  110. style={styles.button}
  111. underlayColor='#99d9f4'
  112. onPress={this.onSearchPressed.bind(this)}>
  113. <Text style={styles.buttonText}>Go</Text>
  114. </TouchableHighlight>
  115. </View>
  116. <Image source={require('./resources/house.png')}
  117. style={styles.image}/>
  118. {spinner}
  119. <Text style={styles.description}>
  120. {this.state.message}
  121. </Text>
  122. </View>
  123. );
  124. }
  125. }

搜索结果

把获取的房产信息, 逐行渲染并显示于ListView中.

  1. class SearchResults extends Component {
  2. /**
  3. * 构造器, 通过Navigator调用传递参数(passProps)
  4. * @param props 状态属性
  5. */
  6. constructor(props) {
  7. super(props);
  8. var dataSource = new ListView.DataSource(
  9. {rowHasChanged: (r1, r2) => r1.guid!== r2.guid}
  10. );
  11. this.state = {
  12. dataSource: dataSource.cloneWithRows(this.props.listings)
  13. };
  14. }
  15. /**
  16. * 点击每行, 通过行数选择信息
  17. * @param propertyGuid 行ID
  18. */
  19. rowPressed(propertyGuid) {
  20. //var property = this.props.listings.filter(prop => prop.guid == propertyGuid)[0];
  21. var property=this.props.listings[propertyGuid];
  22. var mynav=this.props.mynav;
  23. mynav.push({
  24. title: '房产信息',
  25. component: PropertyView,
  26. index:2,
  27. params:{
  28. property:property,
  29. //navigator:this.props.navigator
  30. mynav2:mynav
  31. }
  32. });
  33. }
  34. /**
  35. * 渲染列表视图的每一行
  36. * @param rowData 行数据
  37. * @param sectionID 块ID
  38. * @param rowID 行ID
  39. * @returns {XML} 页面
  40. */
  41. renderRow(rowData, sectionID, rowID) {
  42. var price = rowData.price_formatted.split(' ')[0];
  43. return (
  44. <TouchableHighlight
  45. onPress={()=>this.rowPressed(rowID)}
  46. underlayColor='#dddddd'>
  47. <View style={styles.rowContainer}>
  48. <Image style={styles.thumb} source={{uri:rowData.img_url}}/>
  49. <View style={styles.textContainer}>
  50. <Text style={styles.price}>${price}</Text>
  51. <Text style={styles.title} numberOfLines={1}>
  52. {rowData.title}
  53. </Text>
  54. </View>
  55. </View>
  56. </TouchableHighlight>
  57. );
  58. }
  59. /**
  60. * 渲染, 每行使用renderRow渲染
  61. * @returns {XML} 结果页面的布局
  62. */
  63. render() {
  64. return (
  65. <ListView
  66. dataSource={this.state.dataSource}
  67. renderRow={this.renderRow.bind(this)}
  68. />
  69. );
  70. }
  71. }

房产信息

房产信息是单纯显示页面, 显示图片和文字内容.

  1. BackAndroid.addEventListener('hardwareBackPress', function() {
  2. if(_navigator == null){
  3. return false;
  4. }
  5. if(_navigator.getCurrentRoutes().length === 1){
  6. return false;
  7. }
  8. _navigator.pop();
  9. return true;
  10. });
  11. var _navigator ;
  12. var PropertyView = React.createClass({
  13. getInitialState: function()
  14. {
  15. _navigator = this.props.mynav2;
  16. return {
  17. };
  18. },
  19. render: function() {
  20. var property = this.props.property; // 由SearchResult传递的搜索结果
  21. var stats = property.bedroom_number + ' bed ' + property.property_type;
  22. if (property.bathroom_number) {
  23. stats += ', ' + property.bathroom_number + ' ' +
  24. (property.bathroom_number > 1 ? 'bathrooms' : 'bathroom');
  25. }
  26. var price = property.price_formatted.split(' ')[0];
  27. return (
  28. <View>
  29. <View style={styles.container}>
  30. <Image style={styles.image}
  31. source={{uri: property.img_url}}/>
  32. <View style={styles.heading}>
  33. <Text style={styles.price}>${price}</Text>
  34. <Text style={styles.title}>{property.title}</Text>
  35. <View style={styles.separator}/>
  36. </View>
  37. <Text style={styles.description}>{stats}</Text>
  38. <Text style={styles.description}>{property.summary}</Text>
  39. </View>
  40. </View>
  41. );
  42. }
  43. });

Codes

房产搜索APP安卓版

欢迎大家Follow,Star.

本文参考自wangchenlong

OK, that’s all! Enjoy it!

React Native实例之房产搜索APP的更多相关文章

  1. React Native实例

    本文主要包括以下内容 View组件的实例 Text组件实例 Navigator组件实例 TextInput组件实例 View组件的实例 效果如下 代码如下 /** * Sample React Nat ...

  2. 使用React Native来撰写跨平台的App

    React Native 是一个 JavaScript 的框架,用来撰写实时的.可原生呈现 iOS 和 Android 的应用.其是基于 React的,而 React 是 Facebook 的用于构建 ...

  3. NodeJS笔记(五) 使用React Native 创建第一个 Android APP

    参考:原文地址 几个月前官方推出了快速创建工具包,由于对React Native不熟悉这里直接使用这2个工具包进行创建 1. create-react-native-app(下文简称CRNA): 2. ...

  4. React Native指南汇集了各类react-native学习资源、开源App和组件

    来自:https://github.com/ele828/react-native-guide React Native指南汇集了各类react-native学习资源.开源App和组件 React-N ...

  5. React Native 教程:001 - 如何运行官方控件示例 App

    原文发表于我的技术博客 本文主要讲解了如何运行 React Native 官方控件示例 App,包含了一些 React Native 的基础知识以及相关环境的配置. 原文发表于我的技术博客 React ...

  6. React Native初探

    前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...

  7. React Native开发技术周报1

    (一).资讯 1.React Native 0.21版本发布,最新版本功能特点,修复的Bug可以看一下已翻译 重要:如果升级 Android 项目到这个版本一定要读! 我们简化了 Android 应用 ...

  8. React Native资料汇总

    React Native 官方文档中文版翻译 http://wiki.jikexueyuan.com/project/react-native/homepage.html REACT NATIVE开发 ...

  9. 现有iOS项目集成React Native过程记录

    在<Mac系统下React Native环境搭建>配置了RN的开发环境,然后,本文记录在现有iOS项目集成React Native的过程,官方推荐使用Cocoapods,项目一开始也是使用 ...

随机推荐

  1. 移动端全屏滑动的小插件,简单,轻便,好用,只有3k swiper,myswiper,page,stage

    https://github.com/donglegend/mySwiper mySwiper 移动端全屏滑动的小插件,简单,轻便,好用,只有3k 下载 直接下载 bower install mySw ...

  2. 实现百度IFE2015Spring的任务Task3的几个问题和解决办法

    1.如何实现页面的宽高自适应浏览器的变化,且有一个最小宽和高 <head> <meta charset = "utf-8"> <title>个人 ...

  3. ubuntu 安装mysql

    1.检查是否已经安装mysql netstat -tap | grep mysql 2.安装mysql 2.1 先更新下软件列表 :sudo apt-get update 2.2 安装mysql :s ...

  4. 30秒攻破任意密码保护的PC:深入了解5美元黑客神器PoisonTap

    近日,著名硬件黑客Samy Kamkar利用5美元设备打造的黑客工具PoisonTap,只需30秒,就可以攻破设置有任意密码的电脑系统,并实现长期后门安装.PoisonTap不是暴力破解密码,而是绕过 ...

  5. centos7 开机/etc/rc.local 不执行的问题

    最近发现centos7 的/etc/rc.local不会开机执行,于是认真看了下/etc/rc.local文件内容的就发现了问题的原因了 #!/bin/bash # THIS FILE IS ADDE ...

  6. BZOJ 3364: [Usaco2004 Feb]Distance Queries 距离咨询

    Description 一棵树,询问两点间距离. Sol 倍增. 方向没用. 没有然后了. Code /************************************************ ...

  7. osc的git服务器简单使用。

    1.创建本地仓库 mkdir dir cd dir git init 初始化仓库 2.创建远程仓库 进入远程仓库去创建 3.关联本地仓库与远程仓库 git remote add osc git::.. ...

  8. class.equals

    public boolean equals(Object obj) 1.自身和自身应该是equals的. X.equals(x) return ture2.如果A等于B, 那么B也就等于A . X.e ...

  9. 循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate)的区别

    表示“重复”这个含义的词有很多, 比如循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 循环算是最基础的概念, 凡是重复执行一段代码, 都可以称 ...

  10. poj 2524 (并查集)

    http://poj.org/problem?id=2524 题意:在一所学校里面的人,都有宗教信仰,不过他们的宗教信仰有可能相同有可能不同,但你又不能直接去问他们,但你可以问他们和谁是同一个宗教.通 ...