React-native之Navigator(6)

一.简介

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

二.使用示例

class NavigatorDemo extends Component { render() { //let 主要用于声明变量 let defaultName = 'List'; let defaultComponent = List; return ( <Navigator initialRoute = {{name:defaultName,component:defaultComponent}} configureScene ={ (route) => { //跳转动画 return Navigator.SceneConfigs.VerticalDownSwipeJump; } } renderScene ={ (route,navigator) => { let Component =route.component; //...ES6语法,遍历route所有的参数,赋值给Component 将navigator赋给Component 以便可以通过this.props.navigator获取导航器 return <Component {...route.params} navigator={navigator}/> } } /> ); } }
class List extends Component{ constructor(props){ super(props); this.state ={ id:'1',//列表页传到详情页的参数 user:null,//用于接收从详情页返回时的参数设置为null }; } _pressBtn(){ //const 表示常量 //为什么这里可以取得 props.navigator?请看上文: //<Component {...route.params} navigator={navigator} /> //这里传递了navigator作为props const self = this;//this,代表列表页 const {navigator} =this.props; if(navigator){ navigator.push({//通过push把名称和组件传递给导航器跳转 name:'detail', component:Detail, params:{ id:this.state.id,//获取列表页的id //从详情页获取user getUser:function(user){ self.setState({ user:user, }) } } }) }; } render(){ if(this.state.user){//从详情页获取到用户信息,加载用户信息 return ( <ScrollView style={styles.flex}> <Text style={styles.list_item} >用户信息:{JSON.stringify(this.state.user)}</Text> </ScrollView> ); }else{ return ( <ScrollView style={styles.flex}> <Text style={styles.list_item} onPress={this._pressBtn.bind(this)}>欢乐的敲代码1</Text> <Text style={styles.list_item} onPress={this._pressBtn.bind(this)}>欢乐的敲代码2</Text> <Text style={styles.list_item} onPress={this._pressBtn.bind(this)}>欢乐的敲代码3</Text> </ScrollView> ); } } }
const USER_INFO ={ 1:{name:'zhangsan', age:23}, 2:{name:'lisi', age:22}, };
class Detail extends Component{ constructor(props){ super(props); this.state={}; id:null } //页面加载完后会调用这个方法 componentDidMount(){ this.setState({ id:this.props.id,//从列表页传递过来的id }); } _pressItem(){ const {navigator} = this.props; if(this.props.getUser){ let user =USER_INFO[this.props.id]; this.props.getUser(user); } if(navigator){ navigator.pop(); } } render(){ return ( <ScrollView> <Text style={styles.list_item}>从第一个页面传递过来的id:{this.state.id}</Text> <Text style={styles.list_item} onPress={this._pressItem.bind(this)}>点击我可以返回</Text> </ScrollView> ); } }
const styles = StyleSheet.create({ flex:{ flex:1, }, list_item:{ marginLeft:20, marginRight:20, fontSize:20, borderBottomWidth:1, borderBottomColor:'#ddd', justifyContent:'center', height:40, }, });
效果
List主页面

navigator_1.png

点击list条目跳转到详情页面


navigator_2.png

点击'点击我可以返回' 回到前一个页面


navigator_3.png
三.导航方法

如果你得到了一个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到栈中的第一个场景,卸载掉所有的其他场景。
四.属性
  • 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
  • initialRoute object
    定义启动时加载的路由。路由是导航栏用来识别渲染场景的一个对象。initialRoute必须是initialRouteStack中的一个路由。initialRoute默认为initialRouteStack中最后一项。
  • initialRouteStack [object]
    提供一个路由集合用来初始化。如果没有设置初始路由的话则必须设置该属性。如果没有提供该属性,它将被默认设置成一个只含有initialRoute的数组。
  • navigationBar node
    可选参数,提供一个在场景切换的时候保持的导航栏。
  • navigator object
    可选参数,提供从父导航器获得的导航器对象。
  • onDidFocus function
    每当导航切换完成或初始化之后,调用此回调,参数为新场景的路由。
  • onWillFocus function
    会在导航切换之前调用,参数为目标路由。
  • renderScene function
    必要参数。用来渲染指定路由的场景。调用的参数是路由和导航器。
    (route,navigator) =>{ let Component =route.component; return <Component {...route.params} navigator={navigator}/>
  • sceneStyle
    将会应用在每个场景的容器上的样式。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容