14.React Native实战之Navigator组件初探

一个应用往往是由多功能视图组成!多页面的切换:路由或导航

在RN中专门负责视图切换的组件:Navigator,NavigatorIOS导航器对比:

Navigator和NavigatoriOS 都可以用来管理应用中“场景”的导航(也可以称作屏幕)。

导航器建立了一个路由栈,用来弹出,推入或者替换路由状态。他们和HTML5中的history API很类似。主要的区别在于NavigatorIOS使用了ios中的UINavigationController类,而Navigator则完全用js重写了一个类似功能的React组件。因此Navigator可以兼容IOS和Android,而NavigatorIOS只用于ios.

 

NavigatorIOS

轻量,受限的API设置,使其相对Navigator来说不太方便定制。

由开源社区主导开发---React Native的官方团队并不在自己的应用中使用。

对于大多数正式的App开发,我们建议使用Navigator---使用Navigatorios实现复杂的需求很容易碰到麻烦。

 

导航器通过路由对象来分辨不同的场景。利用renderScene方法,导航栏可以根据指定的路由来渲染场景。

可以通过configureScene属性获取指定路由对象的配置信息,从而改变场景的动画或手势。

 

 

最后的几行:

renderScene={

            (route, navigator) =>

             {

            let Component = route.component;

            return <Component {...route.params} navigator={navigator} />

          }

          } />

这里是每个人最疑惑的,我们先看到回调里的两个参数:route,navigator。通过打印我们发现route里其实就是我们传递的name,component这两个货,navigator是一个Navigator的对象,为什么呢,因为它有push,pop ,jump…等方法,这是我们等下用来跳转页面用的那个navigator对象。

 

return <Component {...route.params} navigator={navigator} />

这里有一个判断,也就是如果传递进来的component存在,那我们就是返回一个这个component,结合前面initialRoute的参数,我们就是知道,这是一个会被render出来给用户看到的component,然后navigator作为props传递给了这个component.

所以下一步,我们可以直接拿到这个props.navigator:

 

 D:\APPwork\zqf\ZhangqfTest\node_modules\react-native\Libraries\CustomComponents\Navigator\NavigatorSceneConfigs.js

1.index.android.js

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, { Component } from 'react';
import {
  AppRegistry,
  //Component,
  StyleSheet,
  PixelRatio,
  Navigator,
  ScrollView,
  Text,
  View
} from 'react-native';


 class ZhangqfTest extends Component {
  render() {
      let defaultName='List';
      let defaultComponent=List;
    return (
        <Navigator
            initialRoute={{ name: defaultName, component: defaultComponent }}
            //配置场景
            configureScene=
                {
            (route) => {

            //这个是页面之间跳转时候的动画,具体有哪些?可以看这个目录下,有源代码的: node_modules/react-native/Libraries/CustomComponents/Navigator/NavigatorSceneConfigs.js

            return Navigator.SceneConfigs.VerticalDownSwipeJump;
          }
          }
            renderScene={
            (route, navigator) =>
             {
            let Component = route.component;
            return <Component {...route.params} navigator={navigator} />
          }
          } />


    );
  }
}


class List extends Component {

    constructor(props) {
        super(props);
        this.state = {};
    }

    _pressButton() {
        const { navigator } = this.props;
        //为什么这里可以取得 props.navigator?请看上文:
        //<Component {...route.params} navigator={navigator} />       
        //这里传递了navigator作为props
        if(navigator) {
            navigator.push({
                name: 'Detail',
                component: Detail,
            })
        }
    }


    render(){
        return (
            <ScrollView style={styles.flex}>
               <Text style={styles.list_item} onPress={this._pressButton.bind(this)} >☆ 豪华邮轮济州岛3日游</Text>
                <Text style={styles.list_item} onPress={this._pressButton.bind(this)}>☆ 豪华邮轮台湾3日游</Text>
                <Text style={styles.list_item} onPress={this._pressButton.bind(this)}>☆ 豪华邮轮地中海8日游</Text>
            </ScrollView>
        );
    }


}

class Detail extends Component{

  constructor(props){
    super(props);
    this.state={};
  }
_pressButton(){
    const{navigator}=this.props;
    if(navigator){
        //很熟悉吧,入栈出栈,把当前的页面pop掉,这里就返回到了上一个页面:List了
        navigator.pop();

    }
}

render(){
    return(
      <ScrollView>
        <Text style={styles.list_item} onPress={this._pressButton.bind(this)}>点击我可以跳回去</Text>
      </ScrollView>
    );
}

}


const styles = StyleSheet.create({
 list_item:{
   height:40,
   marginLeft:10,
   marginRight:10,
   fontSize:20,
   borderBottomWidth:1,
   borderBottomColor:'#ddd',
   justifyContent:'center',

 },


flex:{
  flex:1,
},

});

AppRegistry.registerComponent('ZhangqfTest', () => ZhangqfTest);

 

 

posted @ 2017-03-03 15:29  对自己狠点对自己好点  阅读(312)  评论(0编辑  收藏  举报