B10.Navigator.txt

UP 返回
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:

Navigator参数传递

怎么传递参数过去,或者从对方获取参数。


##从列表页To详情页:
传递参数,通过push就可以了。

params: {
                    id: this.state.id
                }

这个语法是把 routes.params 里的每个key 作为props的一个属性:{...route.params}

 componentDidMount() {
        //这里获取从列表页传递过来的参数: id
        this.setState({
            id: this.props.id
        });
    }

使用这个参数:{this.state.id}

##从详情页To列表页:

综合实例:从列表页传递用户id给详情页,详情页跟进用户id查询用户信息,并把
用户信息回传给列表页显示出来

const self=this;

 params:{
                    id:this.state.id,
                    //从详情页获取user
                    getUser: function(user) {
                        self.setState({
                            user: user
                        })
                    }
                }

 if(this.props.getUser) {
            let user = USER_MODELS[this.props.id];
            this.props.getUser(user);
        }

        if(navigator) {
            //很熟悉吧,入栈出栈~ 把当前的页面pop掉,这里就返回到了上一个页面:List了
            navigator.pop();
        }
DOWN 返回