免费开源的iOS开发学习平台

React Native基础:16-Navigator组件

场景(Scene)

到目前为止,我们都是创建的单页面的应用,接下来我们要学习如何创建多页面的应用。通俗来说,一个完整的界面我们就称之为一个场景,在iOS开发中,最常见的就是一个导航控制器管理着多个子控制器,而每个子控制器我们可以称之为一个场景。下方的示例代码中,我们创建了一个简单的场景(MyScene)。在这个场景中,提供一个文本用于显示场景的名称,另外,还有两个按钮,点击后分别进入下一个场景以及返回上一个场景。

export default class MyScene extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.content}>
          场景:{this.props.title}
        </Text>
        <TouchableHighlight onPress={this.props.onForward}>
          <Text>点我进入下一场景</Text>
        </TouchableHighlight>
        <TouchableHighlight onPress={this.props.onBack}>
          <Text>点我返回上一场景</Text>
        </TouchableHighlight>
      </View>
    );
  }
}

Navigator组件简介

React Native中提供了Navigator组件,它可以管理多个页面间的跳转,同时也提供了页面跳转过程中的一些过渡动画,包括平移,水平翻页、垂直弹出等。使用Navigator组件可以实现在应用的不同场景间进行切换,Navigator通过路由对象来分辨不同的场景。利用Navigator组件中提供的renderScene方法,可以根据指定的路由来渲染场景。另外,通过configureScene属性可以获取指定路由对象的配置信息,从而改变场景的动画或者手势。

在创建Navigator组件时,需要通过设置initialRoute属性来定义启动时加载的路由。路由是导航栏用来识别渲染场景的一个对象。而renderScene函数则用来渲染指定路由的场景。

<Navigator
  initialRoute={{title: '场景1', index: 0}}
  renderScene={...}}
/>

Navigator组件提供了多个用于控制场景切换的方法,最常使用的是push()和pop()。push()方法用来过渡到一个新的场景,而pop()方法则可以返回到上一个场景。

//打开新场景
navigator.push({
  title: '场景2',
  index: 1,
});

//返回上一个场景
navigator.pop();

示例代码

在下方的示例代码中,我们创建了一个Navigator组件,并且通过点击其中的按钮可以实现场景的前进以及回退。

  • 在终端中执行如下命令,创建NavigatorDemo工程;
react-native init NavigatorDemo
  • 在工程中添加一个MyScene.js文件,用于实现MyScene组件。首先,导入使用到的组件并且设置样式。
import React, { Component } from 'react';
import {
  StyleSheet,
  Text,
  View,
  TouchableHighlight
} from 'react-native';
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  content: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  }
});
  • 在MyScene组件中,提供了一个Text组件用于显示当前场景的名称,另外还有两个Button组件,分别用于实现场景的前进和回退操作。
import MyScene from './MyScene';

export default class MyScene extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.content}>
          场景:{this.props.title}
        </Text>
        <TouchableHighlight onPress={this.props.onForward}>
          <Text>点我进入下一场景</Text>
        </TouchableHighlight>
        <TouchableHighlight onPress={this.props.onBack}>
          <Text>点我返回上一场景</Text>
        </TouchableHighlight>
      </View>
    );
  }
}
  • 打开工程的index.ios.js文件,编写组件所使用的样式
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
  instructions: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
});
  • 创建一个Navigator组件,在其中添加一个自定义MyScene组件。
export default class NavigatorDemo extends Component {
  render() {
    return (
      <Navigator
      initialRoute={{title: '场景1', index: 0}}
      renderScene={(route, navigator) =>
        <MyScene
          title={route.title}
          onForward={() => {
            var nextIndex = route.index + 1;
            navigator.push({
              title: '场景 ' + (nextIndex + 1),
              index: nextIndex,
            });
          }}
          onBack={() => {
            if (route.index > 0) {
              navigator.pop();
            }
          }}
        />
      }
      />
    );
  }
}
  • 使用import加载项目所使用的模块,并且注册组件NavigatorDemo成为整个应用的根容器。
import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  Navigator
} from 'react-native';

AppRegistry.registerComponent('NavigatorDemo', () => NavigatorDemo);
  • 在终端中执行下面的命令运行程序,在iOS模拟器中可以看到展示的场景样式,当我们点击按钮可以实现不同场景的切换。
react-native run-ios