《React-Native系列》6、Navigator语法介绍及经典应用
2016-07-28 22:38
489 查看
今天来介绍下ReactNative的Navigator组件。
先来看看官网是怎么说的:
提供的方法:
getCurrentRoutes() - 获取当前栈里的路由,也就是push进来,没有pop掉的那些。
jumpBack() - 跳回之前的路由,当然前提是保留现在的,还可以再跳回来,会给你保留原样。
jumpForward() - 上一个方法不是调到之前的路由了么,用这个跳回来就好了。
jumpTo(route) - 跳转到已有的场景并且不卸载。
push(route) - 跳转到新的场景,并且将场景入栈,你可以稍后跳转过去
pop() - 跳转回去并且卸载掉当前场景
replace(route) - 用一个新的路由替换掉当前场景
replaceAtIndex(route, index) - 替换掉指定序列的路由场景
replacePrevious(route) - 替换掉之前的场景
resetTo(route) - 跳转到新的场景,并且重置整个路由栈
immediatelyResetRouteStack(routeStack) - 用新的路由数组来重置路由栈
popToRoute(route) - pop到路由指定的场景,在整个路由栈中,处于指定场景之后的场景将会被卸载。
popToTop() - pop到栈中的第一个场景,卸载掉所有的其他场景。
属性:(我只列出几个常用的属性)
1、configureScene
function 可选的函数,用来配置场景动画和手势。会带有两个参数调用,一个是当前的路由,一个是当前的路由栈。然后它应当返回一个场景配置对象
(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
2、renderScene
function 必要参数。用来渲染指定路由的场景。调用的参数是路由和导航器。
(route, navigator) => <MySceneComponent title={route.title} navigator={navigator} />
3、initialRoute
object
定义启动时加载的路由。路由是导航栏用来识别渲染场景的一个对象。
简单介绍完Navigator,我们来实现一个经典的例子,如下图所示。
其实,做过Android开发的是不是很熟悉,startActivityForResult
那么我们看看RN怎么实现,说了这么多还没有写一行代码.
上面的代码:
我们通过initialRoute初始化了一个Route,定义了初始化的Component。
设置了切换的动画效果:Navigator.SceneConfigs.HorizontalSwipeJump
指定路由和导航器,注意一定要有navigator={navigator} ,将导航器传递。
这里我们需要注意几点:
1、const { navigator } = this.props; 从props里获取Navigator,确保一直用的同一个。
2、定义一个Route
包含:name、component(待跳转的)
params:一个对象,包含我们需要传递过去的数据和回调方法,回调方法获取选中值后更新状态机变量,这样选中的结构在Form上立马就能看见。
getSelectedItem 就是回调方法,我们就是通过这个方法来实现值得回传。
细心的朋友可能还发现有:
这个和初始化Navigator有关,
这个配置这个sceneConfig属性,我们就可以实现在一个Navigator里切换动画。
譬如:我从一个水平从右向左切入的动画,变换成一个垂直的从上到下切入的动画。
3、navigator.push(route);
Navigator压栈,这个就不用说了吧,有点开发经验的都秒懂
这里我们做了以下几件事:
1、修改本页面的状态机变量,通常表现为,选中某项后,显示一个对勾图片。(用户体验)
2、从props中获取Navigator,调用回调方法getSelectedItem,将值回传给parent。
3、pop掉本页面
这样我们就基本实现了我们要做的功能。是不是很简单呢?
另外,我们使用了InteractionManager.runAfterInteractions的参数中包含一个回调,这个回调会在navigator切换动画结束的时候被触发。这个不在本文讨论的范围。
参考:http://reactnative.cn/docs/0.30/navigator.html#content
先来看看官网是怎么说的:
使用导航器可以让你在应用的不同场景(页面)间进行切换。导航器通过路由对象来分辨不同的场景。利用renderScene方法,导航栏可以根据指定的路由来渲染场景。 可以通过configureScene属性获取指定路由对象的配置信息,从而改变场景的动画或者手势。查看Navigator.SceneConfigs来获取默认的动画和更多的场景配置选项。
提供的方法:
getCurrentRoutes() - 获取当前栈里的路由,也就是push进来,没有pop掉的那些。
jumpBack() - 跳回之前的路由,当然前提是保留现在的,还可以再跳回来,会给你保留原样。
jumpForward() - 上一个方法不是调到之前的路由了么,用这个跳回来就好了。
jumpTo(route) - 跳转到已有的场景并且不卸载。
push(route) - 跳转到新的场景,并且将场景入栈,你可以稍后跳转过去
pop() - 跳转回去并且卸载掉当前场景
replace(route) - 用一个新的路由替换掉当前场景
replaceAtIndex(route, index) - 替换掉指定序列的路由场景
replacePrevious(route) - 替换掉之前的场景
resetTo(route) - 跳转到新的场景,并且重置整个路由栈
immediatelyResetRouteStack(routeStack) - 用新的路由数组来重置路由栈
popToRoute(route) - pop到路由指定的场景,在整个路由栈中,处于指定场景之后的场景将会被卸载。
popToTop() - pop到栈中的第一个场景,卸载掉所有的其他场景。
属性:(我只列出几个常用的属性)
1、configureScene
function 可选的函数,用来配置场景动画和手势。会带有两个参数调用,一个是当前的路由,一个是当前的路由栈。然后它应当返回一个场景配置对象
(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
2、renderScene
function 必要参数。用来渲染指定路由的场景。调用的参数是路由和导航器。
(route, navigator) => <MySceneComponent title={route.title} navigator={navigator} />
3、initialRoute
object
定义启动时加载的路由。路由是导航栏用来识别渲染场景的一个对象。
简单介绍完Navigator,我们来实现一个经典的例子,如下图所示。
其实,做过Android开发的是不是很熟悉,startActivityForResult
那么我们看看RN怎么实现,说了这么多还没有写一行代码.
一、初始化Navigator
render() { let defaultName = 'FormManager'; let defaultComponent = FormManager; return ( <Navigator initialRoute={{ name: defaultName, component: defaultComponent }} configureScene={(route) => { if (route.sceneConfig) { return route.sceneConfig; } return Navigator.SceneConfigs.HorizontalSwipeJump; }} renderScene={(route, navigator) => { let Component = route.component; return <Component {...route.params} navigator={navigator} /> }} /> ); }
上面的代码:
我们通过initialRoute初始化了一个Route,定义了初始化的Component。
设置了切换的动画效果:Navigator.SceneConfigs.HorizontalSwipeJump
指定路由和导航器,注意一定要有navigator={navigator} ,将导航器传递。
二、压栈
在FormManager这个Component中,譬如我们点击字段1,调用onPress方法,跳转到选项页面,代码如下:choose(){ const self=this; const { navigator } = this.props; if(navigator) { var route ={ name: 'ChooseItemComponent', component: ChooseItemComponent, params:{ title:"选择页面", selectedItem:self.state.city, originList:cityList, getSelectedItem: function(selectedItem) { InteractionManager.runAfterInteractions(() => { self.setState({ city: cityList[selectedItem], }) }); } }, sceneConfig:Navigator.SceneConfigs.VerticalUpSwipeJump, }; navigator.push(route); } }
这里我们需要注意几点:
1、const { navigator } = this.props; 从props里获取Navigator,确保一直用的同一个。
2、定义一个Route
包含:name、component(待跳转的)
params:一个对象,包含我们需要传递过去的数据和回调方法,回调方法获取选中值后更新状态机变量,这样选中的结构在Form上立马就能看见。
getSelectedItem 就是回调方法,我们就是通过这个方法来实现值得回传。
细心的朋友可能还发现有:
sceneConfig:Navigator.SceneConfigs.VerticalUpSwipeJump,
这个和初始化Navigator有关,
if (route.sceneConfig) { return route.sceneConfig; }
这个配置这个sceneConfig属性,我们就可以实现在一个Navigator里切换动画。
譬如:我从一个水平从右向左切入的动画,变换成一个垂直的从上到下切入的动画。
3、navigator.push(route);
Navigator压栈,这个就不用说了吧,有点开发经验的都秒懂
三、出栈,并回调
现在我们已经到了选择项的页面,当我们选择某项数据的时候,将选中的值赋给parent页面,并销毁本页面。
代码如下:_chooseItem(i){ var self = this ; InteractionManager.runAfterInteractions(() => { self.setState({ selectedItem:i, }) }); const { navigator } = this.props; if(this.props.getSelectedItem){ this.props.getSelectedItem(i); } setTimeout(function(){ if(navigator) { navigator.pop(); } } ,500); }
这里我们做了以下几件事:
1、修改本页面的状态机变量,通常表现为,选中某项后,显示一个对勾图片。(用户体验)
2、从props中获取Navigator,调用回调方法getSelectedItem,将值回传给parent。
3、pop掉本页面
这样我们就基本实现了我们要做的功能。是不是很简单呢?
另外,我们使用了InteractionManager.runAfterInteractions的参数中包含一个回调,这个回调会在navigator切换动画结束的时候被触发。这个不在本文讨论的范围。
参考:http://reactnative.cn/docs/0.30/navigator.html#content
相关文章推荐
- JavaScript中的Navigator浏览器对象
- javascript学习随笔(编写浏览器脚本 Navigator Scripting )
- ReactNative细节汇总
- code-push 交互式命令行脚本
- 8. react-native-android之----模拟手机百度feed流
- 9. react-native-android之----reactjs基础
- 1. react-native-ios之----20分钟搭建环境
- windows下安装android版reactnative
- JS 基础知识(自学篇)
- React Native 环境配置遇到的坑
- 深入浅出 React Native:使用 JavaScript 构建原生应用
- iOS开发 React-native开发环境配置
- 一些navigator方法小结
- ReactNative 学习第二节 环境搭建
- ReactNative学习 第一节
- node_modules文件名或扩展名太长如何删除
- ReactNative学习
- window对象中的navigator和location的演示
- 关于React Native 网络请求以及变量赋值的问题
- react-native Navigator 填坑