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. nyoj 19 擅长排列的小明(深搜,next_permutation)

    擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想 ...

  2. [luoguP1854] 花店橱窗布置(DP)

    传送门 f[i][j] 表示前 i 盆花,放到前 j 个花盆中的最优解 pre[i][j] 记录前驱 代码 #include <cstdio> #include <cstring&g ...

  3. E - 不容易系列之(4)――考新郎 错排数公式

    国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是这样的:  首先,给每位新娘打扮得几乎一模一 ...

  4. 第3章 ES文档和故障处理

    第3章 ES文档和故障处理 一.ES网络配置表 ES网络配置表是ES的硬件和软件组成的列表.ES网络配置常包括以下项目: 分级 项目 杂项信息 系统名.系统厂商/型号.CPU速率.RAM.存储器.系统 ...

  5. Codeforces 196 D. The Next Good String

    D. The Next Good String time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  6. iOS-UITextView-文本输入视图的使用

    #import "ViewController.h" @interface ViewController ()<UITextViewDelegate> { UIView ...

  7. 到底什么是RPC?

    RPC:远程过程调用,是一种同意分布式应用程序调用网络上不同计算机的可用服务的机制.RPC服务会在注冊表中给自己注冊一个UUID,成为通用唯一标识符.这个UUID针对每一项服务都是一个唯一的值,且在全 ...

  8. Redis 持久化,写入磁盘的方式

    如果帮到了您,可以支持一下,谢谢您的支持! Redis是一个支持持久化的内存数据库=>也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化. redis支持四种持久化方式, 一是 Sn ...

  9. NYOJ_58最少步数(queue+BFS)

    描写叙述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1  1,0,0,1,0,0,1,0,1  1,0,0,1,1,0,0,0,1  1,0,1,0,1,1,0,1,1   ...

  10. luogu3379 【模板】最近公共祖先(LCA) Tarjan

    LCA的Tarjan算法是一个离线算法,复杂度$O(n+q)$. 我们知道Dfs搜索树时会形成一个搜索栈.搜索栈顶节点cur时,对于另外一个节点v,它们的LCA便是v到根节点的路径与搜索栈开始分叉的那 ...