跟我学用REACT NATIVE构建原生应用(五)

本文案例、代码及主要内容基于知乎前端专栏翻译的文章《深入浅出React Native:使用JavaScript构建原生应用》《Introducing React Native: Building Apps with JavaScript》而写。

在原文的基础上做了一些校对,并增加了android得环境安装和调试的内容。

由我书写的注释将会显示左边这个紫色竖线(#523f6d),而原文的注释为蓝色的(#559bce)。

内容传送门

一、《深入浅出R跟我学用React Native构建原生应用(一)
二、《深入浅出R跟我学用React Native构建原生应用(二)
三、《深入浅出R跟我学用React Native构建原生应用(三)
四、《深入浅出R跟我学用React Native构建原生应用(四)
五、《深入浅出R跟我学用React Native构建原生应用(五)
六、《深入浅出R跟我学用React Native构建原生应用(六)

可点击样式

这些 React Native 的原生代码现在应该理解起来轻车熟路了,所以本教程将会加快速度。

在 SearchResults.js 中,destructuring 声明后面添加以下语句来定义样式:

var styles = StyleSheet.create({
  thumb: { width: 80, height: 80, marginRight: 10 },
  textContainer: { flex: 1 },
  separator: { height: 1, backgroundColor: "#dddddd" },
  price: { fontSize: 25, fontWeight: "bold", color: "#48BBEC" },
  title: { fontSize: 20, color: "#656565" },
  rowContainer: { flexDirection: "row", padding: 10 },
});

这些定义了每一行的样式。

接下来修改 renderRow() 如下:

renderRow(rowData, sectionID, rowID) {  var price = rowData.price_formatted.split(' ')[0];

这个操作修改了返回的价格,将已经格式了化的”300000 GBP”中的GBP后缀删除。然后它通过你已经很熟悉的技术来渲染每一行的 UI 。这一次,通过一个 URL 来提供缩略图的数据, React Native 负责在主线程之外解码这些数据。

同时要注意 TouchableHighlight 组件中 onPress属性后使用的箭头函数;它用于捕获每一行的 guid。

最后一步,给类添加一个方法来处理按下操作:

rowPressed(propertyGuid) {  var property = this.props.listings.filter(prop => prop.guid === propertyGuid)[0];}

该方法通过用户触发的属性来定位。目前该方法没有做任何事,你可以稍后处理。现在,是时候欣赏你的大作了。

回到模拟器,按下 Cmd + R 查看结果:

1d29bb1920622180d5ae03c64440b664_b

看起来好多了——尽管你会怀疑是否任何人都能承受住在伦敦的代价!

是时候向应用程序添加最后一个视图了。

房产详情视图

添加一个新的文件 PropertyView.js 到项目中,在文件的顶部添加如下代码:

"use strict";

信手拈来了吧!

接着添加如下样式:

var styles = StyleSheet.create({
  container: { marginTop: 65 },
  heading: { backgroundColor: "#F8F8F8" },
  separator: { height: 1, backgroundColor: "#DDDDDD" },
  image: { width: 400, height: 300 },
  price: { fontSize: 25, fontWeight: "bold", margin: 5, color: "#48BBEC" },
  title: { fontSize: 20, margin: 5, color: "#656565" },
  description: { fontSize: 18, margin: 5, color: "#656565" },
});

然后加上组件本身:

class PropertyView extends Component {
  render() {    var property = this.props.property;    var stats = property.bedroom_number + ' bed ' + property.property_type;    if (property.bathroom_number) {      stats += ', ' + property.bathroom_number + ' ' + (property.bathroom_number > 1        ? 'bathrooms' : 'bathroom');    }
    var price = property.price_formatted.split(' ')[0];

render() 前面部分对数据进行了处理,与通常的情况一样,API 返回的数据良莠不齐,往往有些字段是缺失的。这段代码通过一些简单的逻辑,让数据更加地规整一些。

render 剩余的部分就非常直接了。它就是一个简单的这个状态不可变状态的函数。

最后在文件的末尾加上如下的 export:

module.exports = PropertyView;

返回到 SearchResults.js 文件,在顶部,require React 的下面,添加一个新的 require 语句。

var PropertyView = require("./PropertyView");

接下来更新 rowPassed(),添加跳转到新加入的 PropertyView:

rowPressed(propertyGuid) {  var property = this.props.listings.filter(prop => prop.guid === propertyGuid)[0];

你知道的:回到模拟器,Cmd + R,一路通过搜索点击一行到房产详情界面:

d69b23ae9ede0ceda01a302ce146e091_b

物廉价美——看上去很不错哦!应用即将完成,最后一步是允许用户搜索附近的房产。

Comments