React Native导航器Navigator

  使用导航器可以让你在应用的不同场景(页面)间进行切换。导航器通过路由对象来分辨不同的场景。利用renderScene方法,导航栏可以根据指定的路由来渲染场景。可以通过configureScene属性获取指定路由对象的配置信息,从而改变场景的动画或者手势。——以上内容摘录自React Native中文网

一、Navigator的属性

configureScene

  可选的函数,用来配置场景动画和手势。会带有两个参数调用,一个是当前的路由,一个是当前的路由栈。然后它应当返回一个场景配置对象。

  使用方式:

  (route, routeStack) => Navigator.SceneConfigs.FloatFromRight

  切换效果有:

  Navigator.SceneConfigs.PushFromRight (默认)

  Navigator.SceneConfigs.FloatFromRight

  Navigator.SceneConfigs.FloatFromLeft

  Navigator.SceneConfigs.FloatFromBottom

  Navigator.SceneConfigs.FloatFromBottomAndroid

  Navigator.SceneConfigs.FadeAndroid

  Navigator.SceneConfigs.HorizontalSwipeJump

  Navigator.SceneConfigs.HorizontalSwipeJumpFromRight

  Navigator.SceneConfigs.VerticalUpSwipeJump

  Navigator.SceneConfigs.VerticalDownSwipeJump

initialRoute

  类类型的属性,定义启动时加载的路由。路由是导航栏用来识别渲染场景的一个对象。initialRoute必须是initialRouteStack中的一个路由。initialRoute默认为initialRouteStack中最后一项。

initialRouteStack

  类类型的属性,用来在Navigator组件初加载时提供导航路径。如果没有向Navigator组件提供initialRoute属性,就必须提供initialRouteStack属性;如果提供了initialRoute但没有提供initialRouteStack,那么React Native会生成一个只有initialRoute元素的数据作为initialRouteStack。

navigationBar

  该属性返回一个可以渲染的节点,这个节点可以用作所有界面的通用导航栏。当开发者决定使用navigationBar来进行导航时,大部分应用界面的导航栏都具有相同的格式(相同大小的按钮、标题栏等),只是按钮的图片或者标题栏中的文字各有不同。

  给Navigator组件指定导航栏的示例如下:

  navigationBar = {
      <Navigator.NavigationBar routeMapper={ navigationBarRouteMapper}/>
  }

  Navigator.NavigationBar是一个可显示的React Native组件,它必须有一个routeMapper属性。开发者必须将一个对象指定给routeMapper属性。这个对象可以有三个成员变量:LeftButton、RightButton、Title。其中,Title成员变量必须有。这三个成员变量要求都是函数类型的,Navigator组件渲染导航栏时,使用这三个函数的返回值渲染导航栏的对应区域。

  每个函数可以接收4个参数。示例:

  LeftButton: function( route, navigator, index, navState)

  在三个成员函数返回的可渲染节点的样式中设置三个区域的大小。这三个函数返回的可渲染节点就是三个区域中显示的内容。

  不同的页面需要控制这三个区域中显示不同的内容,开发者需要将不同页面待显示的不同内容(文字、图片)通过route传入这三个函数中,然后这三个函数从route的成员变量中去处传入的供显示的不同内容,最后渲染显示。

  对按钮或输入框的处理,通常都需要调用父组件的函数,这就需要将这个父组件的函数以某种方式传入routeMapper属性中。开发者无法直接给routeMapper属性再传值,但是可以放在route中,由Natigator组件在渲染时交给routeMapper属性。而route中的成员变量,都是由开发者提供的,并且对每个事件只能提供一个回调函数,准确地说,是最近一次提供的回调函数会覆盖上一次提供的回调函数。

Navigator

  提供从父导航器获得的导航器对象。

onDidFocus

  每当导航切换完成或初始化之后,调用此回调,参数为新场景的路由。

  React native鼓励开发者使用navigationContext.addListener(‘didfocus’,callback)事件监听器来实现相同的功能。

onWillFocus

  会在导航切换之前调用,参数为目标路由。

  React native鼓励开发者使用navigationContext.addListener(‘willfocus’,callback)事件监听器来实现相同的功能。

renderScene

  必要参数。用来渲染指定路由的场景。调用的参数是路由和导航器。

sceneStyle

  指定的样式将被应用到每一个切换的场景中。

二、导航器的函数

getCurrentRoutes()

  获取当前栈里的路由,也就是push进来,没有pop掉的那些。

jumpBack()

  退回到上一个界面而不卸载当前界面。

jumpForward()

  沿界面路径向前跳一个界面而不卸载当前界面。

jumpTo(route)

  跳转到某个界面而不卸载任何界面。

push(route)

  导航组件在路径列表最前端添加一个新的界面,并马上跳转至这个界面。

pop()

  导航器退回一个界面并卸载原界面。

replace(route)

  用一个新的路由替换掉当前场景。

replaceAtIndex(route, index)

  使用一个新的界面替代路径表中的第index个界面,但不改变当前显示界面。

  replacePrevious(route)

  将当前导航路径的上一个界面使用指定的界面替代。

resetTo(route)

  跳转到新的场景,并且重置整个路由栈。

immediatelyResetRouteStack(routeStack)

  使用给定的路径表替换当前的路径列表。

  popToRoute(route)

  导航器回退到指定的界面,并且将这个过程中回退过的界面都卸载。

popToTop()

  导航器回退到的第一个场景,卸载掉所有的其他场景。

三、Navigator传值

实现的效果为:第一个界面向第二个界面传值,在第二个界面中改变第一个界面的显示内容。

index.android.js

 import React from 'react';
import {
View,
Navigator,
AppRegistry
} from 'react-native';
import FirstPageComponent from './js/FirstPageComponent';
export default class SampleComponent extends React.Component {
render() {
let defaultName = 'FirstPageComponent';
let defaultComponent = FirstPageComponent;
return (
<Navigator
initialRoute={{ name: defaultName, component: defaultComponent }}
configureScene={(route) => {
return Navigator.SceneConfigs.HorizontalSwipeJumpFromRight;
}}
renderScene={(route, navigator) => {
let Component = route.component;
return <Component {...route.params} navigator={navigator} />
}}
/>
);
}
} AppRegistry.registerComponent('listen1', () => SampleComponent);

入口

第一个界面

 import React from 'react';
import {
View,
Navigator,
TouchableOpacity,
Text,
} from 'react-native'; import SecondPageComponent from './SecondPageComponent'; export default class FirstPageComponent extends React.Component { constructor(props) {
super(props); this.state = {
id: 2,
user: null,
}
} _pressButton() {
let _this = this;
const { navigator } = this.props;
if(navigator) {
navigator.push({
name: 'SecondPageComponent',
component: SecondPageComponent,
params: {
id: this.state.id,
//从SecondPageComponent获取user
getUser: function(user) {
_this.setState({
user: user
})
}
}
});
}
} render() {
if( this.state.user ) {
return(
<View>
<Text>用户信息: { JSON.stringify(this.state.user) }</Text>
</View>
);
}else {
return(
<View>
<TouchableOpacity onPress={this._pressButton.bind(this)}>
<Text>查询ID为{ this.state.id }的用户信息</Text>
</TouchableOpacity>
</View>
);
} }
}

第一个界面

第二个界面

 const USER_MODELS = {
1: { name: 'mot', age: 23 },
2: { name: '晴明大大', age: 25 }
}; import React from 'react';
import {
View,
Navigator,
TouchableOpacity,
Text,
} from 'react-native'; import FirstPageComponent from './FirstPageComponent'; export default class SecondPageComponent extends React.Component { constructor(props) {
super(props);
this.state = {
id: null
}
} componentDidMount() {
//这里获取从FirstPageComponent传递过来的参数: id
this.setState({
id: this.props.id
});
} _pressButton() {
const { navigator } = this.props; if(this.props.getUser) {
let user = USER_MODELS[this.props.id];
this.props.getUser(user);
} if(navigator) {
navigator.pop();
}
} render() {
return(
<View>
<Text>获得的参数: id={ this.state.id }</Text>
<TouchableOpacity onPress={this._pressButton.bind(this)}>
<Text>点我跳回去</Text>
</TouchableOpacity>
</View>
);
}
}

第二个界面

  

  在第二个界面中修改第一个界面的原理是:在第一个界面中声明一个方法,可以更改其state。我们知道,state发生改变,界面就会重新渲染。在传值的时候,将该方法作为一个属性传给第二个界面。在第二个界面中执行该方法,就重新渲染了第一个界面。只不过此时的第一界面没有在屏幕上。当第二个界面卸载(pop)后,返回第一个界面,就看到了更改后的第一个界面。

React Native导航器Navigator的更多相关文章

  1. react native 导航器 Navigator 简单的例子

    最近学习react native 是在为全栈工程师而努力,看网上把react native说的各种好,忍不住学习了一把.总体感觉还可以,特别是可以开发android和ios这点非常厉害,刚开始入门需要 ...

  2. React Native之 Navigator与NavigatorIOS使用

    前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...

  3. React Native之Navigator

    移动应用很少只包含一个页面.从你添加第二个页面开始,就得考虑如何管理多个页面间的跳转了. 导航器正是为此而生.它可以管理多个页面间的跳转,也包含了一些常见的过渡动画,包括水平翻页.垂直弹出等等. Na ...

  4. react native的Navigator组件示例

    import React, {Component} from 'react';import {ScrollView, StyleSheet, Text, View, PixelRatio} from ...

  5. React Native使用Navigator组件进行页面导航报this.props....is not a function错误

    在push的时候定义回调函数: this.props.navigator.push({ component: nextVC, title: titleName, passProps: { //回调 g ...

  6. React Native中Navigator的安装与使用

    一.安装Navigator 1.安装react-native-deprecated-custom-components npm install react-native-deprecated-cust ...

  7. React Native APP结构探索

    APP结构探索 我在Github上找到了一个有登陆界面,能从网上获取新闻信息的开源APP,想来研究一下APP的结构. 附上原网址:我的第一个React Native App 具体来讲,就是研究一个复杂 ...

  8. iOS 写给iOS开发者的React Native学习路线(转)

    我是一名iOS开发者,断断续续一年前开始接触React Native,最近由于工作需要,专职学习React Native也有一个多月了.网络上知识资源非常的多,但能让人豁然开朗.迅速学习的还是少数,我 ...

  9. 写给iOS开发者的React Native学习路线(转)

    我是一名iOS开发者,断断续续一年前开始接触React Native,最近由于工作需要,专职学习React Native也有一个多月了.网络上知识资源非常的多,但能让人豁然开朗.迅速学习的还是少数,我 ...

随机推荐

  1. 程序员节QWQ

    据$lc$说,今天是程序员节QWQ 过节啦QWQ

  2. java连接数据库(经常用)

    一.配置环境 1.首先下载sqlserver2008驱动文件,找到sqljdbc4.jar文件,将这个文件拷到C:\Program Files\Java\jdk1.8.0_121\jre\lib\ex ...

  3. java虚拟机(二)--垃圾收集器与内存分配策略

    1.判断对象是否存活的算法: 1.1.引用计数算法:给对象添加一个引用计数器,每当有一个地方引用他时,计数器+1,当引用失效时,计数器-1,任何时刻计数器为0的对象就是不可能再被引用的,但是他很难解决 ...

  4. 听SEO大神夜息分享

    今天偶然听说了百度站长平台,又偶然在上面发现了夜息大神的分享(http://zhanzhang.baidu.com/college/videoinfo?id=871). 之前对于SEO的了解只限于减少 ...

  5. jq超简单的流式布局,代码简单,容易修改

    1.看看效果吧! 2.html代码index.html <!DOCTYPE html> <html lang="en"> <head> < ...

  6. BP神经网络及其在教学质量评价中 的应用

    本文学习笔记是自己的理解,如有错误的地方,请大家指正批评.共同进步.谢谢! 之前的教学质量评价,仅仅是通过对教学指标的简单处理.如求平均值或人为的给出各指标的权值来加权求和,其评价结果带有非常大主观性 ...

  7. jvm 堆内存 栈内存 大小设置

                        4种方式配置不同作用域的jvm的堆栈内存. 1.Eclise 中设置jvm内存: 改动eclipse的配置文件,对全部project都起作用 改动eclipse ...

  8. java中inputstream的使用

    java中的inputstream是一个面向字节的流抽象类,其依据详细应用派生出各种详细的类. 比方FileInputStream就是继承于InputStream,专门用来读取文件流的对象,其详细继承 ...

  9. 深入理解 JBoss 7/WildFly Domain 模式启动过程

    概述 JBoss 7/WildFly 以 domain 模式启动时会启动多个 JVM.比如例如以下通过启动脚本启动 domain 模式: ./domain.sh 启动后我们查看进程: [kylin@l ...

  10. Kafka实战:如何把Kafka消息时延秒降10倍

    背景 国内某大型税务系统,业务应用分布式上云改造. 业务难题 如上图所示是模拟客户的业务网页构建的一个并发访问模型.用户在页面点击从而产生一个HTTP请求,这个请求发送到业务生产进程,就会启动一个投递 ...