有了一些对React Native开发的简单了解,让我们从实战出发。一起来构建一个简单的京东client。

这个client是仿照之前版本号的京东client开发的Android版应用,来源于CSDN上的一位分享者,再次向他表示感谢!

本文会对京东client首页的布局进行简单的分析,并对搜索框部分的开发进行介绍,其它内容在后面的文章中继续介绍。

后继文章:

React Native入门——布局实践:开发京东client首页(二)TabBar的构建

欢迎交流。

1.京东client首页布局分析

如图所看到的,京东client首页布局基本分为下面几个部分:

(1)头部:搜索栏。由京东logo、搜索输入框和扫描button组成

(2)内容部分:父级的元素中为ListView或ScrollView,可滑动,当中包含一个轮播图、一组功能button和秒杀、拍卖商品列表

(3)底部:TabBar,用于切换页面

2.创建project和相关文件、文件夹

首先,我们利用react-native init命令创建一个名为JdApp(当然也能够自己起)的React Nativeproject(详细操作请參考:http://blog.csdn.net/yuanguozhengjust/article/details/50468050),项目结构例如以下图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

依据我们刚才对京东client结构的分析。眼下能够先新建几个文件,用于拆分代码。详细方案例如以下:
images文件夹:用于存放相关图片
Header.js:用于构建头部搜索栏(本文主要介绍此文件里的内容)
MainScreen.js:主屏幕文件。起到最外层控制作用
HomePage.js:首页文件,用于构建轮播图、功能button、特价列表等

3.调研相关控件

眼下App中须要用到轮播图、Tab这两个高级控件,而React Native原生的控件仅有TabBarIOS可供iOS平台使用,不能满足我们的需求,依据在Github上搜索的结果。我们能够选用下面几个第三方控件进行开发:
react-native-viewpager:可实现轮播图效果,地址:https://github.com/race604/react-native-viewpager
react-native-tab-navigator:可用于构建Tab,并能够轻松地进行页面切换,地址:https://github.com/exponentjs/react-native-tab-navigator
有兴趣的读者。还能够自行构建Tab和Swiper这样的控件,做一个符合项目需求的控件并不难,但想要扩展性、通用性更强,不是一件easy的事情。

4.分析搜索栏的基本布局

头部的搜索栏。分为三个部分:logo、输入框、扫码button。

当中。logo能够使用Image控件
输入框稍复杂,外层是一个圆角的View,其内部左側是一个Image。用于展示放大镜Icon,中间为一个TextInput控件用于输入,右側为一个Image,用于展示语音搜索Icon
右側扫码button也比較简单。仅为一个Image
那么依据FlexBox布局原则。能够按下面方式进行布局:

这里特别说明一下。因为React Native不支持自己主动计算Image等View的大小(參见:http://facebook.github.io/react-native/docs/images.html#why-not-automatically-size-everything)。所以我们不能像Android的XML那样,设置为wrap_content,必须为Image指定宽度和高度。而因为React
Native使用的是类似Android dp的像素,所以请依据设计图的尺寸自行计算,这里推荐一个站点:https://pixplicity.com/dp-px-converter/

5.代码实现

确定好了搜索栏的布局,那么我们就開始详细使用JavaScript代码进行实现。首先新建一个Header.js的文件,并引入我们须要用到的控件
'use strict';

import React, {
Component
Image,
TextInput
View,
StyleSheet
} from 'react-native';

接着声明类和样式,之所以使用export,是由于要在其它类中使用(如:MainScreen)

export default class Header extends Component {

}

const styles = StyleSheet.create({

});

然后在Header类的render()方法中编写JSX代码,在StyleSheet.create()方法中。编写类CSS的样式,例如以下:

export default class Header extends Component {
render() {
return (
<View style={styles.container}> </View>
)
}
} const styles = StyleSheet.create({
container: {
flexDirection: 'row',
paddingLeft: 10,
paddingRight: 10,
paddingTop: Platform.OS === 'ios' ? 20 : 0, // 处理iOS状态栏
height: Platform.OS === 'ios' ? 68 : 48, // 处理iOS状态栏
backgroundColor: '#d74047',
alignItems: 'center'
}});

然后我们在模拟器或者真机上跑一下,看看效果

嗯,不错,貌似是我们想要的效果。接着把图片资源导入项目中去。非常easy,仅仅须要在文件夹创建文件夹,将图片复制进去。WebStorm等IDE就可以自己主动识别

依据我们之前的分析,完毕样式表的设计。例如以下:

const styles = StyleSheet.create({
container: {
flexDirection: 'row', // 水平排布
paddingLeft: 10,
paddingRight: 10,
paddingTop: Platform.OS === 'ios' ? 20 : 0, // 处理iOS状态栏
height: Platform.OS === 'ios' ? 68 : 48, // 处理iOS状态栏
backgroundColor: '#d74047',
alignItems: 'center' // 使元素垂直居中排布, 当flexDirection为column时, 为水平居中
},
logo: {
height: 24,
width: 64,
resizeMode: 'stretch' // 设置拉伸模式
},
searchBox: {
height: 30,
flexDirection: 'row',
flex: 1, // 相似于android中的layout_weight,设置为1即自己主动拉伸填充
borderRadius: 5, // 设置圆角边
backgroundColor: 'white',
alignItems: 'center',
marginLeft: 8,
marginRight: 12
},
scanIcon: {
height: 26.7,
width: 26.7,
resizeMode: 'stretch'
},
searchIcon: {
marginLeft: 6,
marginRight: 6,
width: 16.7,
height: 16.7,
resizeMode: 'stretch'
},
voiceIcon: {
marginLeft: 5,
marginRight: 8,
width: 15,
height: 20,
resizeMode: 'stretch'
},
inputText: {
flex: 1,
backgroundColor: 'transparent',
fontSize: 14
}
});

请认真注意上面代码中的凝视,标有凝视的地方。即为和普通iOS、Android开发不太一样的地方!

因为我们已经将父级的元素中的排布方向改为水平,所以我们仅仅需将须要展现的元素放入<View>的子元素就可以,例如以下代码所看到的:

export default class Header extends Component {
render() {
return (
<View style={styles.container}>
<Image source={require('./images/header/header_logo.png')} style={styles.logo}/>
<View style={styles.searchBox}>
<Image source={require('./images/header/icon_search.png')} style={styles.searchIcon}/>
<TextInput
keyboardType='web-search'
placeholder='搜索京东商品/店铺'
style={styles.inputText}/>
<Image source={require('./images/header/icon_voice.png')} style={styles.voiceIcon}/>
</View>
<Image source={require('./images/header/icon_qr.png')} style={styles.scanIcon}/>
</View>
)
}
}

须要注意的是

1.style的使用,当使用StyleSheet创建的样式时,外层仅仅须要一层{},而直接声明须要再加一层,即直接声明了匿名变量
2.Image的source能够使用网络图片或本地资源,使用本地资源时,类似require.js的包引用,而使用网络资源时,用法例如以下:source={{uri:'http://xxxxxxx'}}
3.TextInput的键盘类型能够使用keyboardType进行设置。占位字符使用placeholder设置,详细请參见官方文档

这时在模拟器或真机上Reload JS一下。就能够看到我们想要的界面了:

React Native入门——布局实践:开发京东client首页(一)的更多相关文章

  1. React Native入门教程 1 -- 开发环境搭建

    有人问我为啥很久不更新博客..我只能说在学校宿舍真的没有学习的环境..基本上在宿舍里面很颓废..不过要毕业找工作了,我要渐渐把这个心态调整过来,就从react-native第一篇博客开始.话说RN也出 ...

  2. React Native布局实践:开发京东client首页(三)——轮播图的实现

    上篇文章中,我们一起构建了京东client的TabBar.在本文中.将继续向大家介绍京东client首页轮播图及其下发功能button的开发方法,如今就让我们開始吧! 1.相关控件调研 眼下在Gith ...

  3. 基于React Native的58 APP开发实践

    React Native在iOS界早就炒的火热了,随着2015年底Android端推出后,一套代码能运行于双平台上,真正拥有了Hybrid框架的所有优势.再加上Native的优秀性能,让越来越多的公司 ...

  4. React Native入门教程 3 -- Flex布局

    上一篇文章中介绍了基本组件的使用 React Native入门教程(笔记) 2 – 基本组件使用及样式 本节内容将继续沿用facebook官方例子介绍如何使用Flexbox布局把界面设计的多样化. 转 ...

  5. React Native入门指南

    转载自:http://www.jianshu.com/p/b88944250b25 前言 React Native 诞生于 2015 年,名副其实的富二代,主要使命是为父出征,与 Apple 和 Go ...

  6. React Native入门教程2 -- 基本组件使用及样式

    在上一篇文章中,我们学会了如何搭建React Native的环境(React Native入门教程(笔记) 1 – 开发环境搭建),不知道你们是否搭建好了呢,如果还没有,那么快动起小手,来体验RN带给 ...

  7. React Native入门——IDE及其它相关基础技术

    关于React Native的开发,当中一个问题是缺少好用的IDE,有些人说不就是JS么,搞一个记事本也就写了,那样尽管牛逼,但事实上还是非常头大的,有一款好的IDE还是能提升开发效率的,这里对几个还 ...

  8. React Native 入门基础知识总结

    中秋在家闲得无事,想着做点啥,后来想想,为啥不学学 react native.在学习 React Native 时, 需要对前端(HTML,CSS,JavaScript)知识有所了解.对于JS,可以看 ...

  9. React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块

    尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 告诉大家一个好消息. ...

随机推荐

  1. (待解决)IDEA配置JDBC查询数据库PreparedStatement pstmt = dbconn.prepareStatement(sql)出现空指针错误

    package com.demo; import java.io.*; import java.sql.*; import java.util.*; import javax.servlet.*; i ...

  2. sin_addr.s_addr和sin_addr.S_un.S_addr

    sin_addr.s_addr和sin_addr.S_un.S_addr 先mark一下,等下写

  3. Python自动化测试框架——生成测试报告

    如何才能让用例自动运行完之后,生成一张直观可看易懂的测试报告呢? 小编使用的是unittest的一个扩展HTMLTestRunner 环境准备 使用之前,我们需要下载HTMLTestRunner.py ...

  4. rpm 包管理器

    rpm 包管理器 二进制应用程序的组成部分: 二进制文件.库文件.配置文件.帮助文件 程序包管理器:不同厂商的程序,包管理器也不同. debian:deb文件, dpkg包管理器 redhat: rp ...

  5. Python中 模块、包、库

    模块:就是.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块. 包:在模块之上的概念,为了方便管理而将文件进行打包.包目录下第一个文件便是 __init__.py,然后是一些模块文件和 ...

  6. include_once 问题

    最近在做微信小程序,在include_once 微信文件后,该方法return 前面会用特殊字符,导致我return 给前端的本来是json串变成了字符 解决方法 : ob_clean(); retu ...

  7. 【02】使用Firebug查看和编辑HTML和CSS

    使用Firebug查看和编辑HTML和CSS 描述 在本章节的教程中,我们将讨论如何使用Firebug查看和编辑HTML和CSS. 使用Firebug查看和编辑HTML 在你要查看的元素上右击鼠标然后 ...

  8. 创意、实现和合作:一次原创H5的尝试

    3月的某一天需求同学说:我们想做一个爆款的回流H5. 好的事实上并没有这么夸张. 不过我们确实是第一次真正意义上做这样一个以互动展示为主要形式.以传播和拉回流为主要目的的H5. 虽然最后也没有成为真正 ...

  9. 【Kubernetes】Kubernetes的Service外部访问方式:NodePort和LoadBalancer

    Kubernetes的Pod的寿命是有限的,它们不会复活,因此尽管每个Pod都有自己的IP地址,但是这些IP地址是不可靠的,会随着Pod的消亡而消失. 这就带来一个问题,如果一些Pod的集合(称之为b ...

  10. 机器学习基础-Logistic回归2

    随机梯度上升法--一次仅用一个样本点来更新回归系数(因为可以在新样本到来时对分类器进行增量式更新,因而属于在线学习算法) 梯度上升法在每次更新回归系统时都需要遍历整个数据集,该方法在处理100个左右的 ...