React Native (一):基础
React Native (二):StatusBar 、 NavigationBar 与 TabBar
React Native (三):自定义视图
React Native (四):加载新闻列表
React Native (五):上下拉刷新加载
React Native (六):加载所有分类与详情页
项目地址
React Native App 的视图结构
首先把 setup.js 的 Root 以及 布局 的代码改一下:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | class Root extends React.Component {render() {
 return (
 <View style={styles.container}>
 
 </View>
 );
 }
 }
 
 
 const styles = StyleSheet.create({
 container: {
 flex: 1,
 backgroundColor: 'white',
 },
 
 });
 
 | 
React Native 的所有界面都是在一个主视图上,这里的这个 <View> 跟 iOS 中的 Window 是同样的,这里跟 Android 不太一样。
当然运行在 iOS 和 Android 中还是以 ViewController 和 Activity 展示的。
StatusBar
iOS 和 Android 的 StatusBar 是差不多的,都是顶部那高度 20 的部分,用来显示信号、电量等系统的信息。
在 setup.js 中加入 StatusBar:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | import {StyleSheet,
 Text,
 View,
 StatusBar
 } from 'react-native';
 
 class Root extends React.Component {
 render() {
 return (
 <View style={styles.container}>
 <StatusBar
 barStyle={'light-content'}
 backgroundColor={'#000000'}
 />
 </View>
 );
 }
 }
 
 
 | 
StatusBar 的配置可以看这里,注意有些属性只针对特定平台。
这样可以设置整个 App 中 StatusBar 的样式,如果有某个页面 A 的 StatusBar 需要特殊处理,那么就在 A 页面加入 StatusBar 进行设置。
Navigator
我们需要用 Navigator 来让整个 App 可以在页面之间跳转。
Navigator 和 iOS 的一样,都是对页面进行 push 和 pop ,跟 Android 的 NavigationView 不是一个东西。
官方文档在这里
现在在 App 文件夹内创建一个新的文件 App.js :
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 
 | 'use strict';
 
 import React from 'react'
 
 import {
 StyleSheet,
 View,
 Text
 
 } from 'react-native';
 
 export default class App extends React.Component {
 
 render() {
 return (
 <View style={styles.view}>
 <Text>main</Text>
 </View>
 )
 }
 }
 
 const styles = StyleSheet.create({
 view: {
 flex: 1,
 backgroundColor: 'white',
 alignItems: 'center',
 justifyContent: 'center'
 
 },
 });
 
 
 
 | 
然后在 setup 内 StatusBar 下面加入 Navigator :
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | import App from './App'
 
 <Navigator
 initialRoute={{ component: App }}
 
 style={{flex:1}}
 renderScene={(route, navigator) => {
 BackAndroid.addEventListener('hardwareBackPress', function() {
 if(navigator == null){
 return false;
 }
 if(navigator.getCurrentRoutes().length === 1){
 return false;
 }
 navigator.pop();
 return true;
 });
 
 let Component = route.component;
 return <Component {...route.params} navigator={navigator}/>
 
 }}
 />
 
 
 | 
其中 initialRoute 设置了 component ,是最底层的第一个页面。
然后 renderScene 控制 push 的时候做哪些操作,这里的 BackAndroid.addEventListener 是监听了 Android 的物理返回按键。
现在运行可以看见页面中间有个 main :

你可能会发现为什么没 NavigationBar 呢,我们后面再加。
tab-navigator
官方并没有 TabBar ,我们使用一个第三方 react-native-tab-navigator
在项目根目录执行命令
| 1
 | npm install react-native-tab-navigator --save
 | 
安装完成后在 App.js 加入 TabNavigator:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 
 | const home_key = 'home'
 const satin_key = 'satin'
 const setting_key = 'setting'
 
 
 import Home from './Home/Home'
 import Satin from './Satin/Satin'
 import Setting from './Setting/Setting'
 
 
 <TabNavigator>
 <TabNavigator.Item
 selected={this.state.selectedTab === home_key}
 title="首页"
 titleStyle={styles.tabText}
 selectedTitleStyle={styles.selectedTabText}
 renderIcon={() => <Image style={styles.icon} source={require("./Images/root/home_unselect.png")} />}
 renderSelectedIcon={() => <Image style={styles.icon} source={require("./Images/root/home_select.png")} />}
 onPress={() => this.setState({ selectedTab: home_key })}>
 
 <Home navigator={this.props.navigator}/>
 </TabNavigator.Item>
 <TabNavigator.Item
 selected={this.state.selectedTab === satin_key}
 title="段子"
 titleStyle={styles.tabText}
 selectedTitleStyle={styles.selectedTabText}
 renderIcon={() => <Image style={styles.icon} source={require("./Images/root/activity_unselect.png")} />}
 renderSelectedIcon={() => <Image style={styles.icon} source={require("./Images/root/activity_select.png")} />}
 onPress={() => this.setState({ selectedTab: satin_key })}>
 
 <Satin navigator={this.props.navigator}/>
 </TabNavigator.Item>
 <TabNavigator.Item
 selected={this.state.selectedTab === setting_key}
 title="我的"
 titleStyle={styles.tabText}
 selectedTitleStyle={styles.selectedTabText}
 renderIcon={() => <Image style={styles.icon} source={require("./Images/root/my_unselect.png")} />}
 renderSelectedIcon={() => <Image style={styles.icon} source={require("./Images/root/my_select.png")} />}
 onPress={() => this.setState({ selectedTab: setting_key })}>
 
 <Setting navigator={this.props.navigator}/>
 </TabNavigator.Item>
 </TabNavigator>
 
 
 | 
配置也比较易懂。
另外创建 3 个文件 Home.js 、 Satin.js 和 Setting.js 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | import React from 'react'
 import {
 View,
 StyleSheet
 } from 'react-native'
 
 
 export default class Satin extends React.Component {
 render() {
 return (
 <View style={styles.view}>
 
 </View>
 )
 }
 }
 
 const styles = StyleSheet.create({
 view: {
 flex:1,
 backgroundColor: 'orange'
 }
 })
 
 
 | 
可以给每个设置不同的颜色,这样点击界面切换也很明显。

具体的代码可以看 项目
NavigationBar
同意官方也没有提供 NavigationBar,我们需要自定义一个。
然后在 Home.js 、  Satin.js 和 Setting.js 加入
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 
 | 
 import React from 'react'
 
 import {
 View,
 StyleSheet
 } from 'react-native'
 
 import NavigationBar from '../Custom/NavBarCommon'
 
 
 export default class Home extends React.Component {
 render() {
 return (
 <View style={styles.view}>
 <NavigationBar
 title="首页"
 unLeftImage={true}
 />
 
 </View>
 )
 }
 }
 
 const styles = StyleSheet.create({
 view: {
 flex:1,
 backgroundColor: 'white'
 }
 })
 
 
 | 

项目地址