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